2014-10-24 1 views
1

У меня есть ++ код C и октава, что оба вычислить то же уравнениеРезультатов С ++ и Октавных отличаются для простых арифметического

В C++

#include <math.h> 
int main() 
{ 
    float x = 1.5f; 
    float y = pow(x, 6) * 235809835.41f - pow(x, 5) * 2110439254.2f + pow(x, 4) *7869448124.8f - pow(x, 3) * 15648965509.0f + pow(x, 2) * 17503313074.0f - (x)* 10440563329.0f + 2594694745.0f; // result y = 3584 
    return 0; 
} 

в октавном

x = 1.5 
y = (x^6) * 235809835.41 - (x^5) * 2110439254.2 + (x^4) *7869448124.8 - (x^3) * 15648965509 + (x^2) * 17503313074 - (x)* 10440563329 + 2594694745‏ // result y = 26 

Вычисленное значение of y отличается в двух случаях. C++ вычисляет y как 3584, а Octave вычисляет y как 26. Что может быть причиной этого расхождения?

EDIT: Excel производит тот же результат, что и Octave, и результат также логичен в контексте уравнения. Итак, что-то не так с кодом C++ или компилятором.

+0

FWIW, Максима показывает результат будет 26.81078290939331. Не уверен, что округляет Octave ... – cdhowie

+3

Скорее всего, у вас будет значительная потеря точности на C++ из-за отмены, в то время как Octave может рассчитывать с расширенной точностью или переупорядочивает порядок операций. –

+0

октава 3.8.2 дает 26.811, как и должно быть. Вы округлились до самого низкого значения? – ederag

ответ

6

Это связано с ограниченной точностью типа float, что, вероятно, приводит к эффективному отбрасыванию одной из операций, поскольку один операнд имеет меньшую величину, чем другая, чтобы вызвать значительное изменение результата , (См this extremely contrived example, который показывает, что это может выглядеть.)

Если переписать код, чтобы использовать тип double, который является более точным, то the result is 26.810783, который соответствует результату я получаю от оценки формулы в Maxima.

Дальнейшее чтение: What Every Computer Scientist Should Know About Floating-Point Arithmetic