Helkar Posted December 9, 2015 Share Posted December 9, 2015 a = 1 - 0.9 b = 0.1 if a == b: print 'eq' else: print a print b какой output? 1 @ Quote Link to comment Short link Share on other sites More sharing options...
sirmax Posted December 9, 2015 Share Posted December 9, 2015 (edited) float сравнивать нельзя, там будет погрешность в пределах дельты. Это на всех языках, питон тут совсем не уникален. Релевантная статья в википедии: Машинный эпсилон. Edited December 9, 2015 by sirmax @ Quote Link to comment Short link Share on other sites More sharing options...
StranikS_Scan Posted December 9, 2015 Share 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 Link to comment Short link Share on other sites More sharing options...
Yukikaze Posted December 9, 2015 Share Posted December 9, 2015 Макс прав, нужно как-то так a = 1 - 0.9 b = 0.1 if abs(a - b) < epsilon: print 'eq' @ Quote Link to comment Short link Share on other sites More sharing options...
sirmax Posted December 9, 2015 Share 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 Link to comment Short link Share on other sites More sharing options...
Yukikaze Posted December 9, 2015 Share 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 Link to comment Short link Share on other sites More sharing options...
sirmax Posted December 9, 2015 Share 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 Link to comment Short link Share on other sites More sharing options...
StranikS_Scan Posted December 9, 2015 Share Posted December 9, 2015 Ха-ха-ха. Реально поржал. Паскакаль - это не "любой язык", это нечто! :) Нечто без треугольных колес и руля под задницей ))))) Умели люди делать. @ Quote Link to comment Short link Share on other sites More sharing options...
Yukikaze Posted December 9, 2015 Share Posted December 9, 2015 Просто похоже паскалю точности real'а не хватило, если заменить на 10 байтный extended то поведение такое же как и остальных @ Quote Link to comment Short link Share on other sites More sharing options...
sirmax Posted December 9, 2015 Share Posted December 9, 2015 Просто похоже паскалю точности real'а не хватило, если заменить на 10 байтный extended то поведение такое же как и остальных У них это тоже в доке написано: http://edn.embarcadero.com/article/22507 @ Quote Link to comment Short link Share on other sites More sharing options...
StranikS_Scan Posted December 9, 2015 Share Posted December 9, 2015 (edited) Просто похоже паскалю точности real'а не хватило, если заменить на 10 байтный extended то поведение такое же как и остальных В паскале 7.0 не было extended он в OP появился, там да, проблема есть )))))) Edited December 9, 2015 by StranikS_Scan @ Quote Link to comment Short link Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.