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

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

Войти через центр авторизации
Похожие вопросы