Почему эти 2 версии кода дают разные результаты
У меня есть 2 версии одного и того же полинома, но они дают существенно разные результаты, и я не уверен, почему.
// Example program
#include <iostream>
#include <string>
#include <math.h>
float v1(float alpha)
{
alpha = 1.0-alpha;
alpha = 1.0-pow(alpha, 5.0)*6.0 - 15.0*pow(alpha,4.0) +10.0*pow(alpha,3.0);
return alpha;
}
float v2(float alpha)
{
alpha = 1.0-alpha;
alpha = 1.0-alpha*alpha*alpha*(alpha*((alpha*6.0) -15.0) + 10.0);
return alpha;
}
int main()
{
for(float t=0; t<=1; t+=0.1)
{
float a1 = v1(t);
float a2 = v2(t);
std::cout<< a1 << ", " << a2 << std::endl;
}
}
Выход:
-10, 0
-5.09444, 0.00856005
-1.99008, 0.05792
-0.17992, 0.16308
0.74944, 0.31744
1.125, 0.5
1.19456, 0.68256
1.13392, 0.83692
1.05408, 0.94208
1.00844, 0.99144
1 ответ
Решение
Выражение в v2
математически эквивалентно
1.0 - (6*pow(alpha, 5) - 15*pow(alpha, 4) + 10*pow(alpha, 3))
Обратите внимание на дополнительный набор скобок. Ваши две функции не эквивалентны по той же причине 1 - x^2 + x
не эквивалентно 1 - (x^2 + x)
Если вы добавите дополнительный набор скобок вокруг выражения в v1
вы получаете одинаковый результат от обеих функций (кроме некоторых небольших ошибок округления с плавающей точкой).