Полезно ли е да има междинни резултати при удвояване, когато входът и изходът са плаващи?

Чудя се за следното: Имам метод, който приема float като вход и връща float след известно изчисление. Изчисленията могат да включват всичко като събиране, деление, логаритми, степени и т.н. Докато правите това, междинният резултат трябва да бъде съхранен няколко пъти. Нещо лудо като това:

float performSomeComputations(float value)
{
    // addition, substraction, logarithms, multiplication, etcetera
    float a = value * 12.0;
    float b = math.pow(a, 34.0);
    float c = math.log10(b +  value - 567);
    return a + b + c;
}

Въпросът ми е: има ли значение как съхранявате междинните резултати? т.е. като float или като double? Да приемем, че междинните стойности не надвишават минималната и/или максималната стойност, тогава очевидно ще има разлика. Но дали върнатата стойност ще бъде по-точна, ако се използват double типове, или ще получавате винаги точно същия отговор, след като най-накрая се върне обратно към float? И възможно ли е отговорът да варира според езика за програмиране?


person Yellow    schedule 08.10.2013    source източник


Отговори (1)


Зависи от входовете разбира се. Но да имаш междинни резултати с по-висока точност от крайните резултати според мен е добра идея, защото резултатът ти ще бъде поне толкова точен, колкото ако си използвал същата точност.

Ако изчисленията и числата са такива, че прецизността на междинните резултати е малко по-висока, възможно е крайният резултат така или иначе да е същият. Но това не винаги ще бъде така; в някои случаи, особено ако има сложни изчисления, които отнемат много стъпки, крайният резултат ще бъде по-прецизен, защото има по-малка загуба на точност на всяка стъпка.

Дали зависи от езиците за програмиране: не трябва, но не бих го изключил напълно. Предполагам, че ще е необходимо тестване, за да се определи (или четене на документацията на езика или компилатора). Най-общо казано бих си помислил, че тъй като говорим за прецизност, правилото ще се прилага винаги: вашият резултат ще бъде поне толкова прецизен, колкото в случая, когато не сте използвали по-прецизни междинни продукти.

person Roy Dictus    schedule 08.10.2013
comment
Ясно е, че резултатът ще бъде поне толкова точен с doubles, но ако няма значение, защо да се занимавате с всички кастинги? Бихте ли дали пример за случай, в който има значение? - person Yellow; 08.10.2013
comment
ако има сложни изчисления, които отнемат много стъпки... Това би било възможност за загуба на точност на всяка стъпка, но по-малко, когато междинните резултати са по-точни. - person Roy Dictus; 08.10.2013
comment
Справедливо, но в крайна сметка междинният double ще бъде прехвърлен към float, така че допълнителната прецизност се губи отново. И така, как можете да сте сигурни, че няма цялата допълнителна прецизност винаги да бъде загубена по време на този етап? С други думи, как можете да сте сигурни, че double междинните продукти си заслужават? - person Yellow; 08.10.2013