#include <stdio.h>int main() { double a=0.1+0.1+0.1; printf("%20.19f", a);};
0.3000000000000000444
> (+ 0.1 0.1)0.2> (+ 0.1 0.1 0.1)0.30000000000000004
Чтобы продемонстрировать, что не только Питон "такой неточный", вот проверка на C:Код#include <stdio.h>int main() { double a=0.1+0.1+0.1; printf("%20.19f", a);};Выдало Код0.3000000000000000444
"Остапа понесло..."Вот тоже самое в языке Sheme (диалект Лиспа):
Насколько я понял в C, тоже все нормально если не вызывать принудительно. Я про "%20.19f".
printf("%f", a);
import std.stdio;void main() { float a=0.1+0.1+0.1; writeln(a);}
import std.format;import std.stdio;void main() { float a=0.1+0.1+0.1; writeln(format("%20.19f", a)); double b=0.1+0.1+0.1; writeln(format("%20.19f", b));}
Я конечно слышал про теорию 2+2=5
Что значит "вызывать принудительно"? Если написать Кодprintf("%f", a);то ответ выглядит 0.30000 . Это не значит, что точность выше, просто не все цифры по умолчанию в printf попадают. А "%20.19f" выводит всё, что есть в переменной на самом деле.
Теперь я понял проблему Cycles Developers по части Equal Math Node
ЦитироватьЯ конечно слышал про теорию 2+2=5http://3.bp.blogspot.com/-1RWhjvKWnL0/T_iqq_Vkv1I/AAAAAAAAAns/Yc_nFd02tlU/s1600/97961.jpeg
ЦитироватьТеперь я понял проблему Cycles Developers по части Equal Math NodeНу как бы известный факт, что числа с плавающей точкой нельзя просто на равенство сравнивать. Нужно объявлять epsilon, вычитать, и сравнивать разницу с этим epsilon.
>>> round ( 0.1 + 0.1 + 0.1+ 0.1+ 0.1+ 0.1+ 0.1+ 0.1+ 0.1+ 0.1 ,5)1.0
>>> int (( 0.1 + 0.1 + 0.1+ 0.1+ 0.1+ 0.1+ 0.1+ 0.1+ 0.1+ 0.1)*10)/100.9
а так будет занятный результат
>>> int (( 0.1 + 0.1 + 0.1+ 0.1+ 0.1+ 0.1+ 0.1+ 0.1+ 0.1+ 0.1)*10)/100
Во 2-м Питоне результат ещё веселее