Helkar 385 Posted December 9, 2015 a = 1 - 0.9 b = 0.1 if a == b: print 'eq' else: print a print b какой output? 1 Quote Share this post Link to post Short link Share on other sites
sirmax 5,499 #303816 Posted December 9, 2015 (edited) float сравнивать нельзя, там будет погрешность в пределах дельты. Это на всех языках, питон тут совсем не уникален. Релевантная статья в википедии: Машинный эпсилон. Edited December 9, 2015 by sirmax Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #303818 Posted December 9, 2015 (edited) Машинный нуль тут не причем. Код вида: program Project1; {$APPTYPE CONSOLE} uses SysUtils; var a,b: real; begin a:=1-0.9; b:=0.1; if a=b then write(a-b); end. >>> 0.00000000000000E+0000 на любом языке программирования, даст нам равенство. Питон же в свою очередь выдает такое: a = 1.0 - 0.9 b = 0.1 print a-b <<< -2.77555756156e-17 Edited December 9, 2015 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
Yukikaze 57 #303819 Posted December 9, 2015 Макс прав, нужно как-то так a = 1 - 0.9 b = 0.1 if abs(a - b) < epsilon: print 'eq' Quote Share this post Link to post Short link Share on other sites
sirmax 5,499 #303820 Posted December 9, 2015 Макс прав, нужно как-то так a = 1 - 0.9 b = 0.1 if abs(a - b) < epsilon: print 'eq' Не знаю, как в питоне, а в C обычно fabs() используют, так как строгое типизирование аргументов приведет abs() к int'у. Но смысл понятен. В шарпе, например, рекомендуется использовать Double.Equals(). В MSDN неплохо описана механика и особенности. Особенно интересно сравнивать разные типы. Quote Share this post Link to post Short link Share on other sites
Yukikaze 57 #303821 Posted December 9, 2015 @StranikS_Scan, у C# аналогичное поведение что и у питона, странно было бы ожидать чего-то другого. using System.IO; using System; class Program { static void Main() { double a = 1.0 - 0.9; double b = 0.1; if(a == b) Console.WriteLine("Equal"); else Console.WriteLine("NOT Equal"); } } Quote Share this post Link to post Short link Share on other sites
sirmax 5,499 #303822 Posted December 9, 2015 Код вида: program Project1; {$APPTYPE CONSOLE} uses SysUtils; var a,b: real; begin a:=1-0.9; b:=0.1; if a=b then write(a-b); end. >>> 0.00000000000000E+0000 на любом языке программирования, даст нам равенство. Ха-ха-ха. Реально поржал. Паскакаль - это не "любой язык", это нечто! :) Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #303823 Posted December 9, 2015 Ха-ха-ха. Реально поржал. Паскакаль - это не "любой язык", это нечто! :) Нечто без треугольных колес и руля под задницей ))))) Умели люди делать. Quote Share this post Link to post Short link Share on other sites
Yukikaze 57 #303824 Posted December 9, 2015 Просто похоже паскалю точности real'а не хватило, если заменить на 10 байтный extended то поведение такое же как и остальных Quote Share this post Link to post Short link Share on other sites
sirmax 5,499 #303825 Posted December 9, 2015 Просто похоже паскалю точности real'а не хватило, если заменить на 10 байтный extended то поведение такое же как и остальных У них это тоже в доке написано: http://edn.embarcadero.com/article/22507 Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #303826 Posted December 9, 2015 (edited) Просто похоже паскалю точности real'а не хватило, если заменить на 10 байтный extended то поведение такое же как и остальных В паскале 7.0 не было extended он в OP появился, там да, проблема есть )))))) Edited December 9, 2015 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites