Операция на поплавках теряет точность и меняет знак - PullRequest
0 голосов
/ 15 апреля 2011

У меня особенная проблема. Мне поручили рефакторинг некоторого старого кода на работе и я столкнулся с проблемой.

У меня есть три массива с плавающей точкой с именами VIL, ZET и GZ3D.

Значения в VIL генерируются с помощью этого кода:

for(k=1;k<sommet[i];k++)
{
    if(ZET[k][i]>0)
    {
        Z=pow(10.0,ZET[k][i]/10.0);
        VIL[i]=VIL[i]+0.00344*(GZ3D[k][i]-GZ3D[k-1][i])*(float)pow(Z,(4.0/7.0))/1000.0;
    }
}

Я скопировал функцию, которая включает вычисления, и запустил ее. Но теперь, когда я сравниваю результаты, созданные старым кодом (которые являются corect), и мои результаты, я получаю это:

VIL is not equal between the two files at the index [10748]
Values "old:new" :0.079468:-0.086186
VIL is not equal between the two files at the index [10749]
Values "old:new" :0.073242:-0.085514
VIL is not equal between the two files at the index [10750]
Values "old:new" :0.070435:-0.083805
VIL is not equal between the two files at the index [10751]
Values "old:new" :0.067200:-0.081059
VIL is not equal between the two files at the index [10752]
Values "old:new" :0.063843:-0.077580
VIL is not equal between the two files at the index [10753]
Values "old:new" :0.056824:-0.072087
VIL is not equal between the two files at the index [10754]
Values "old:new" :0.054077:-0.068363

Так что результаты, которые я получаю, отрицательны и всегда отличаются на ~ 10%.

Кто-нибудь знает, что может вызвать это?

Ответы [ 2 ]

1 голос
/ 15 апреля 2011

Используйте двойной расчет, как указано выше, и установите ручные приоритеты для операций

VIL[i]=VIL[i]+ ((0.00344*(GZ3D[k][i]-GZ3D[k-1][i])) * ((float)pow(Z,(4.0/7.0))) /1000.0);

. По возможности следует избегать операций, снижающих точность: умножение двух очень больших или очень маленьких значений, сложение или вычитание.где один операнд большой, а второй маленький и так далее ...

1 голос
/ 15 апреля 2011

Пытается использовать double вместо float для приведений типов и типов.Двойной размер составляет 8 байт, тогда как число с плавающей запятой равно 4.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...