В общем, начал листать книжку C# 7 и .NET Core Кросс-платформенная разработка для профессионалов и наткнулся на это:
Хорошо, что в оборонке JavaScrip... / it-юмор :: geek
В общем, начал листать книжку C# 7 и .NET Core Кросс-платформенная разработка для профессионалов и наткнулся на это:
Хорошо, что в оборонке JavaScript не используется.
Там же вроде история другая совсем была. Часы компьютера комплекса давали отставание пару секунд на сутки, или что то около того. По правилам, раз в сутки компьютер должен был перезагружаться и время должно было вносится заново. Только на это забили болт, и за пару месяцев ошибка набралась такая, что система наведения ракет, которая использовала время для расчета координат комплекса, решила что комплекс находится в 200 км от точки, в которой он находился на самом деле.
Вот в книге по программированию, которую я читал, этот случай был написан куда ближе к правде. И вполне вероятно она была о C#. Но не могу найти или вспомнить, что за книга была.
"Хорошо, что в оборонке JavaScript не используется." Почему?
Оператор == совсем "не правильно" работает
Ну так все знают, что перед сравнением лучше всего закастить числа в текст и только потом сравнивать.
Не, Иисус, у тебя получился уксус, а не вино.
так ты ведь забыл после каста отсортировать значение...
Так для чисел с плавающей точкой (стандарта IEEE 754) в принципе 0.1 + 0.2 != 0.3 из-за неточности представления. Хоть в каком языке считай.
JavaScript создавался как багогенератоный гибкий и нетепизированный язык
он создавался для свистоперделок, а не для нынешних сайтов полностью написанных на нем
нпм инстал +2гб и гогого в продакшин
Потому что JavaScript богомерзкая хтоническая ересь, написанная бандой человеконенавистников.
> "Хорошо, что в оборонке JavaScript не используется." Почему?
Потому что автор идиот и пизданул как в лужу перднул. Во всех актуальных языках, внезапно, по-умолчанию используется один стандарт чисел с плавающей точкой, а именно IEEE 754.
Иронично, но на большинстве языков будут одинаковые ошибки зависимо от стандарта. К примеру для JS характерны все ошибки, которые характерны для других динамических языков.
Правило не сравнивать числа с плавающей точкой оператором равенства не зависит от языка программирования, оно работает для всех чисел в формате IEEE754 и в убогом формате JavaScript.
Ладно, не буду (что блядь?)
Это перевод кривой? Сравнивать double (8 байт) и float (4байта) на равенство - действительно не есть правильно.
Не только. Даже два float лучше так не сравнивать, если до того их не приравняли. То есть, если один получился в результате вычислений, а второй константа - они не совпадут.
Я сейчас лезу куда не знаю, но это больше на пиздеж похоже. При сравнении двух float берутся их значения. То что ты писал может произойти только если сравнивались 2 объекта типа Float, тогда да, значения у них одинаковые, но это разные объекты.
Нет, там прикол в том, что 2 числа будут сравниваться с максимальной точностью (образно выражаясь до последнего знака), чего автору кода чаще всего не требуется. Хотя бы потому, что при вычислениях возникают погрешности. Правильно использовать сравнения больше/меньше и какую-то допустимую погрешность.
А не проще переопределить компаратор для float, чтобы сокращал ненужные числа после запятой?
Тогда это будет уже не ==, а что-то типа:
bool equal( float a, float b, float epsilon )
Собственно это и хотел сказать автор книги.
Ну тогда это и вправду имеет смысл, меня сбыла с толку мысль, что числа одинаковые.
То, о чем речь в посте наглядно иллюстрируется следующим образом:
В калькуляторе виндоус производятся вычисления sqr(х^2)-x, где х - любое положительное число.
Если что sqr - извлечение квадратного корня.
Ты странный... sqr - возведение в квадрат...
И я попробовал как ты сказал в виндовс калькуляторе.
Так калькулятор написан не для программистов, и либо округляет результат, либо как хороший компилятор соптимизирует и выкинет ненужные функции.
Это делается чтобы не пугать бухгалтерш всякими 1.3425345e-10
Да, под sqr подразумевалось извлечение корня. В калькуляторе семерки будет как-то так:
sqr это квадрат, а sqrt - корень.
Странно, у меня по-другому получилось:
Я тоже не очень хорошо разбираюсь, может появится кто-то кто разбирается, но вроде стандартная практика в C# считать разницу между двумя float'ами или doble'аблами и сравнивать ее с допустимой разницой, например, Double.Epsilon. Даже если сравниваешь значения. Или как-то так.
Вроде здесь описано https://csharpindepth.com/articles/FloatingPoint
Хотя вполне вероятно, что я сморозил хуйню.
попробуй, будет ли sqr(х^2)-x==0, где х, любое положительное
Может проблема что он путает sqr и sqrt?
ну как сказать...
Да вроде все всё поняли.
Таки вроде в бэйсике sqr - корень.
10.11f + 1f == 11.11f будет false
блядь, а я думаю, что за двойная точность. ох уж эти локализации общепринятых терминов и названий
Так, блэт, а какой тогда оператор использовать-то? А то у меня есть кусок, который две переменные float не может сравнить.
Помогите позязя.
Но это не точно. Сейчас пойду за пруфами.