В общем, начал листать книжку C# 7 и . / it-юмор :: geek (Прикольные гаджеты. Научный, инженерный и айтишный юмор)

it-юмор geek 

В общем, начал листать книжку C# 7 и .NET Core Кросс-платформенная разработка для профессионалов и наткнулся на это:

Никогда не сравнивайте числа двойной точности с плавающей запятой с помощью оператора ==. Во время войны в Персидском заливе американский противоракетный комплекс Patriot был запрограммирован с использованием чисел двойной точности с плавающей запятой в вычислениях. Неточность в расчетах привела к

Хорошо, что в оборонке JavaScript не используется.


Подробнее
Никогда не сравнивайте числа двойной точности с плавающей запятой с помощью оператора ==. Во время войны в Персидском заливе американский противоракетный комплекс Patriot был запрограммирован с использованием чисел двойной точности с плавающей запятой в вычислениях. Неточность в расчетах привела к тому, что комплекс не смог перехватить иракскую ракету Р-17 и она попала в американские казармы в городе Дхарам, в результате чего погибли 28 американских солдат. Подробнее см. на сайте https://www.ima.umn.edu/^arnold/disasters/patriot.html.
it-юмор,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор
Еще на тему
Развернуть
Там же вроде история другая совсем была. Часы компьютера комплекса давали отставание пару секунд на сутки, или что то около того. По правилам, раз в сутки компьютер должен был перезагружаться и время должно было вносится заново. Только на это забили болт, и за пару месяцев ошибка набралась такая, что система наведения ракет, которая использовала время для расчета координат комплекса, решила что комплекс находится в 200 км от точки, в которой он находился на самом деле.

Но это не точно. Сейчас пойду за пруфами.
apoel apoel 17.06.201921:51 ответить ссылка 21.9
Вот в книге по программированию, которую я читал, этот случай был написан куда ближе к правде. И вполне вероятно она была о C#. Но не могу найти или вспомнить, что за книга была.
Mohave Mohave 17.06.201923:13 ответить ссылка -2.4
"Хорошо, что в оборонке JavaScript не используется." Почему?
Оператор == совсем "не правильно" работает
ANTPro ANTPro 17.06.201922:26 ответить ссылка -0.9
Ну так все знают, что перед сравнением лучше всего закастить числа в текст и только потом сравнивать.
Не, Иисус, у тебя получился уксус, а не вино.

>	(0.1 + 0.2) .toStringO <• "0.30000000000000004м
>	(0.3).toString()
<• "0.3"
> (0.1 + 0.2) .toStringO <• false
== (0.3) .toStringO
так ты ведь забыл после каста отсортировать значение...
Так для чисел с плавающей точкой (стандарта IEEE 754) в принципе 0.1 + 0.2 != 0.3 из-за неточности представления. Хоть в каком языке считай.
JavaScript создавался как багогенератоный гибкий и нетепизированный язык
он создавался для свистоперделок, а не для нынешних сайтов полностью написанных на нем
нпм инстал +2гб и гогого в продакшин
dr9vik dr9vik 17.06.201922:42 ответить ссылка 2.3
Потому что JavaScript богомерзкая хтоническая ересь, написанная бандой человеконенавистников.
> "Хорошо, что в оборонке JavaScript не используется." Почему?

Потому что автор идиот и пизданул как в лужу перднул. Во всех актуальных языках, внезапно, по-умолчанию используется один стандарт чисел с плавающей точкой, а именно IEEE 754.

Иронично, но на большинстве языков будут одинаковые ошибки зависимо от стандарта. К примеру для JS характерны все ошибки, которые характерны для других динамических языков.
Правило не сравнивать числа с плавающей точкой оператором равенства не зависит от языка программирования, оно работает для всех чисел в формате IEEE754 и в убогом формате JavaScript.
Ладно, не буду (что блядь?)
Это перевод кривой? Сравнивать double (8 байт) и float (4байта) на равенство - действительно не есть правильно.
nivago nivago 17.06.201923:10 ответить ссылка -0.1
Не только. Даже два float лучше так не сравнивать, если до того их не приравняли. То есть, если один получился в результате вычислений, а второй константа - они не совпадут.
Axil Axil 17.06.201923:14 ответить ссылка 0.3
Я сейчас лезу куда не знаю, но это больше на пиздеж похоже. При сравнении двух float берутся их значения. То что ты писал может произойти только если сравнивались 2 объекта типа Float, тогда да, значения у них одинаковые, но это разные объекты.
Raline Raline 17.06.201923:22 ответить ссылка -1.7
Нет, там прикол в том, что 2 числа будут сравниваться с максимальной точностью (образно выражаясь до последнего знака), чего автору кода чаще всего не требуется. Хотя бы потому, что при вычислениях возникают погрешности. Правильно использовать сравнения больше/меньше и какую-то допустимую погрешность.
SSSZ SSSZ 17.06.201923:32 ответить ссылка 0.9
А не проще переопределить компаратор для float, чтобы сокращал ненужные числа после запятой?
Raline Raline 17.06.201923:36 ответить ссылка 0.1
Тогда это будет уже не ==, а что-то типа:
bool equal( float a, float b, float epsilon )
Собственно это и хотел сказать автор книги.
Axil Axil 17.06.201923:58 ответить ссылка 0.6
Ну тогда это и вправду имеет смысл, меня сбыла с толку мысль, что числа одинаковые.
Raline Raline 18.06.201900:01 ответить ссылка 0.0
То, о чем речь в посте наглядно иллюстрируется следующим образом:
В калькуляторе виндоус производятся вычисления sqr(х^2)-x, где х - любое положительное число.
Если что sqr - извлечение квадратного корня.
Ты странный... sqr - возведение в квадрат...
И я попробовал как ты сказал в виндовс калькуляторе.
V( sqr( 5 ) )
Raline Raline 17.06.201923:50 ответить ссылка 0.0
Так калькулятор написан не для программистов, и либо округляет результат, либо как хороший компилятор соптимизирует и выкинет ненужные функции.
Это делается чтобы не пугать бухгалтерш всякими 1.3425345e-10
Axil Axil 18.06.201900:04 ответить ссылка 0.2
Да, под sqr подразумевалось извлечение корня. В калькуляторе семерки будет как-то так:
1ькулятор Вид Правка Справка
0 U3J
-8,1648465955514287168521180122928е-39
9 Градусы О Радианы О Грады
Int
dms
F-E
Inv
sinh
cosh
tanh
Exp
In
sin
cos
tan
Mod
*2
x1
log
n!
Yx
X
10a
MC
MR
CE
0
MS
M-
M-
V
%
Ух
sqr это квадрат, а sqrt - корень.
Странно, у меня по-другому получилось:
^--- - ____
Axil Axil 18.06.201900:20 ответить ссылка 0.2
У меня в примере 2 а не 5 просто. Попробовал 5, все совпадает)
Sqr у меня просто как сокращение от square, без привязки к лексике какого-либо языка. Буду знать, что это вызывает вопросы.
Я тебе верил! Ты был мне как брат
Я тоже не очень хорошо разбираюсь, может появится кто-то кто разбирается, но вроде стандартная практика в C# считать разницу между двумя float'ами или doble'аблами и сравнивать ее с допустимой разницой, например, Double.Epsilon. Даже если сравниваешь значения. Или как-то так.
Вроде здесь описано https://csharpindepth.com/articles/FloatingPoint
Хотя вполне вероятно, что я сморозил хуйню.
0 references
static void Main(string[] args)
{
const float V = (float)22.22;
float a = (float)ll.ll, b = (float)ll.ll
if((a+b)==V)
{
Console!. WriteLine ( "XYM" ) ;
.WniteLine("Hello World!");
dr9vik dr9vik 17.06.201923:34 ответить ссылка 0.6
попробуй, будет ли sqr(х^2)-x==0, где х, любое положительное
const float V = (float)22.22;
float a = (float)ll.ll, b = (float)ll.ll;
if((a+b)==V)
{
Console]. WriteLineC'Xyii");
}
int c = 2;
if (0 == (Math.Sqnt(c * c) - c))
{
l
}
Console]. WriteLine ( "2Xyil" );
double cc = 2.2;
if (0 == (Math.Sqrt(cc * cc) - cc))

C:\Program FilesXdotnet'
dr9vik dr9vik 17.06.201923:51 ответить ссылка 0.1
Может проблема что он путает sqr и sqrt?
Raline Raline 17.06.201923:52 ответить ссылка 0.0
ну как сказать...
JL U
19
20 21 22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
B
B
} ►!
//}
double cc = 2.2; var c0 = Math.Sqrt(cc * cc) -if (0 == (Math.Sqrt(cc * cc) -{
Console]. WriteLine("3XyM");
}
float k = (float)2.2;
var k0 = Math.Sqrt(k * k) - k;
if (0 == k0)
{
}
Console.
dr9vik dr9vik 17.06.201923:57 ответить ссылка 0.5
Да вроде все всё поняли.
Таки вроде в бэйсике sqr - корень.
10.11f + 1f == 11.11f будет false
блядь, а я думаю, что за двойная точность. ох уж эти локализации общепринятых терминов и названий
Heralt Heralt 17.06.201923:26 ответить ссылка 0.5
Так, блэт, а какой тогда оператор использовать-то? А то у меня есть кусок, который две переменные float не может сравнить.
Помогите позязя.
ПИДОРЫ, ПОМОГИТЕ
КУПОН
НА 1 ПОМОЩЬ
Noxred Noxred 18.06.201907:03 ответить ссылка -0.5
Окей, почитал нить, увидел.
Noxred Noxred 18.06.201908:19 ответить ссылка -0.1
Ты напоминаешь "а всё, сам нашёл"
Только зарегистрированные и активированные пользователи могут добавлять комментарии.
Похожие темы

Похожие посты
Принципы, паттерны и методики гибкой разработки на языке Среш.: [пер. с англ.]
Роберт С. Мартин
2011 - Всего страниц: 757
0 Отзывы ©
Цель книги - собрать воедино все методики гибкой разработки и показать их работоспособность
подробнее»

geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор книга C# языки программирования программирование

Принципы, паттерны и методики гибкой разработки на языке Среш.: [пер. с англ.] Роберт С. Мартин 2011 - Всего страниц: 757 0 Отзывы © Цель книги - собрать воедино все методики гибкой разработки и показать их работоспособность
@Я - программист
Сам cafe начальниц. 
Самоучитель
записи
компакт-дисков
СО-ЯМ О"' !*АМ
¡¿¿О-Ш
ОМО+М
ОУО-1*
под ред. Архипова А. К
подробнее»

it-юмор geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор самоучитель книга

 Самоучитель записи компакт-дисков СО-ЯМ О"' !*АМ ¡¿¿О-Ш ОМО+М ОУО-1* под ред. Архипова А. К
12
Оглавление
9.3.	Объявление аспектов......................................364
9.3.1.	Использование атрибутов для объявления аспектов..364
9.3.2.	Применение динамического перехвата................369
9.3.3.	Пример: перехват с Windsor........................372
9.4.	Резюме....................
подробнее»

книги geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор

12 Оглавление 9.3. Объявление аспектов......................................364 9.3.1. Использование атрибутов для объявления аспектов..364 9.3.2. Применение динамического перехвата................369 9.3.3. Пример: перехват с Windsor........................372 9.4. Резюме....................