Задать вопрос
@prvvetstol

Почему один и тот же код на python и c++ дает разный результат?

Писал тернарный поиск на python для задачи, получил ответ, он не сошелся с примером в задаче. Посмотрел правильный код на C++ - в нем та же структура, но ответ другой. Прикладываю код на python, на плюсах и input&output из задачи.

python:
Vp, Vf = map(float, input().split())
a = float(input())
def f(x):
    global Vp, Vf, a
    return ((1-a)**2 + x**2)/Vp + (a**2+(1-x)**2)/Vf
l = 0
r = 1
while r - l > 1e-8:
    a = (2*l + r) / 3
    b = (l + 2*r) / 3
    print(a, b)
    if f(a) < f(b):
        r = b
    else:
        l = a
print("%.9f" % ((l+r)/2))


c++:
#include <bits/stdc++.h>

using namespace std;

#define forn(i, n) for (int i = 0; i < (int)(n); i++)

int main( void ) {
	long double vp, vf, a;
	cin >> vp >> vf >> a;

	auto f = [&](long double x) {
		return hypotl(1 - a, x) / vp + hypotl(a, 1 - x) / vf;
	};

	long double l = 0, r = 1;
	while (r - l > 1e-8) {
		auto a = (2 * l + r) / 3;
		auto b = (l + 2 * r) / 3;

		if (f(a) < f(b))
		 	r = b;
		else
		 	l = a;
	}
	printf("%.9f\n", (double)((l + r) / 2));
}


Примеры:
607449502885d522535677.png

Не понимаю, в чем проблема. Искал подобные вопросы, но в них, наоборот, в коде на плюсах вычислялся неправильный ответ (из-за неправильного употребления float и double). Думал, это из-за различий в операциях деления на разных языках, но на первых нескольких итерациях while в обоих случаях дает одни и те же ответы.

UPD: Вот несколько первых результатов перерасчетов a и b в while на си и питоне + ответы
607450dfe6aa5039324158.png
Что не так?
  • Вопрос задан
  • 410 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
@Mercury13
Программист на «си с крестами» и не только
hypot в Си даёт гипотенузу, а a²+b² в змее-питоне — квадрат гипотенузы.
Ответ написан
Комментировать
@prvvetstol Автор вопроса
Еще ошибка из-за того, что переменная а, которая дается в условии задачи для построения графика, имеет такое же название, как переменная а в while, из-за чего в f(n), которая использует global a, все ломается посреди работы.
Вот такие пироги!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@itgood
для начала это код на cи а не на с++ , и в си есть приколы с выводом в консоль и возможно в этом разница, и чет не особо похож код на поиск
Ответ написан
maaGames
@maaGames
Погроммирую программы
квадратный корень на питоне не берётся для сумм квадратов, перед делением на Vp,Vf.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы