Код | double value = 0.5 * Math.Sqrt(2) + 1; value--;
|
Результат : 0.70710678118654746
Ты удивлён? = Я - нет 
Дело в том, что вещественные типы слегка шумят в хвосте, это факт. Но физики, математики и программисты, кропевшие над железом и микропрограммами сопроцессора не такие уж прям идиоты, чтобы считать их труд полным, как ты пишешь, косяков. Это не так просто, там имеются некоторые тонкости, в частности, статистические. Язык C# (и .NET) здесь вообще ни при чём, а на работу процессоров есть стандарты и спецификации в несколько тысяч страниц. Вот несколько простых наблюдений :- результат не меняется при многократном просчёте одного и того же выражения
- если просчитать эквивалентное выражение (другое, но с тем же результатом), хвост может измениться
- вещественные операции над числами с большим разбросом по порядку (напр, очень маленьким и очень большим) может вызвать неограниченную потерю значащих позиций в представлении результата вплоть до NaN и Infinity
Если так критично, попробуй воспользоваться типом decimal. Он в два раза больше : 128 бит. Подозреваю, что он - "сконструированный" (раз работает на 32-битных машинках), но точность всё-равно могла бы и повыситься :
Код | decimal value = (Decimal)0.5 * (Decimal)Math.Sqrt(2) + (Decimal)1; value--; // 0.70710678118655M
value = (Decimal)0.5 * (Decimal)Math.Sqrt(2); // 0.70710678118655M
|
|