Привет всем! Помогите побороть, никак не могу понять, как 1.2 может быть меньше 1.2 когда они по всей видимости равны. А по схеме так и выходит... Чудеса, или с головой что-то?)) Спасибо.
Когда-то судя по поиску поднимал такую тему, но тогда проблема была явная, а сейчас непонятно..
http://forum.hiasm.net/forum.html?q=3&p=252963
Придется писать свой If-Else на IC ?))
Эх, а я надеялся на Хиасм бортовой компьютер пилотируемой космической станции и ядерные боеголовки точного наведения для ядерного щита программировать))
code_36649.txt
Этот топик читают: Гость
Ответов: 1297
Рейтинг: 47
|
|||
карма: 3 |
| ||
файлы: 1 | code_36649.txt [900B] [597] |
Разработчик
Ответов: 26267
Рейтинг: 2141
|
|||
Что-то из этой оперы -- http://forum.hiasm.net/forum.html?q=3&p=280687#p280687
Для решения проблемы можно применить округление
|
|||
карма: 22 |
|
Ответов: 1297
Рейтинг: 47
|
|||
Спасибо Неско, завтра проверю. Сейчас на айпаде. Но если виновато округление, тогда почему число 1.1 не вызывает срабатывания? Такое ощущение что оператор выполняется не меньше, а меньше или равно. Странновато.
|
|||
карма: 3 |
|
Разработчик
Ответов: 26267
Рейтинг: 2141
|
|||
Aziz писал(а): Такое ощущение что оператор выполняется не меньше, а меньше или равно.Нормальное обычное сравнение идет
|
|||
карма: 22 |
|
Ответов: 8947
Рейтинг: 824
|
|||
Aziz, тут и проверять нечего, знать надо что компьютер пользует двоичную систему, а не десятичную и дроби круглые в десятичной в двоичной системе периодические и бесконечны в большинстве случаев, в т. ч. и 0.1 и 0.2:
0.1[10]=0.000110011001100110011001100....[2] 0.2[10]=0.001100110011001100110011001....[2] В зависимости от того на какую цифру "1" или "0" пришлось округление последнего знака (для Real 8-байтного числа это 52-ой бит после запятой) округление будет с избытком или недостатком, вот и получается, что 0.1+0.1<>0.2. А в какую сторону не равно, можете сами проверить продолжив дроби до 52 знака, округлив их до 51 знаков и сложив 0.1 + 0.1 и сравнивая сумму с 0.2 ![]() |
|||
карма: 19 |
|
Ответов: 1297
Рейтинг: 47
|
|||
Любопытные грабли) Спасибо!
------------ Дoбавленo в 09.35: Такое ощущение, что я вернулся в эпоху аналоговых вычислительных машин, когда число определяется неоднозначно. В принципе, тип Real - это и есть аналог, и его действительно точно никогда не вычислишь. Все-таки мир не оцифруешь никак( Хотя есть мнение что само Бытие имеет дискретную природу, и что аналог - лишь высококачественная выборка с квантованием на уровне кварков) ------------ Дoбавленo в 09.36: Может, раз так, стоит встроить это округление в элементы? Во избежание неуловимых глюков. |
|||
карма: 3 |
|
Разработчик
Ответов: 26267
Рейтинг: 2141
|
|||
Aziz писал(а): Может, раз так, стоит встроить это округление в элементы?Не стоит. Иногда количество разрядов округления является значением неопределенным |
|||
карма: 22 |
|
Ответов: 1297
Рейтинг: 47
|
|||
Я имел ввиду, с полем для указания количества разрядов округления конечно. Или тогда встроить в справку этот пример)
------------ Дoбавленo в 12.09: Спасибо, Неско, все заработало. Буду теперь аккуратнее с дробными числами. ------------ Дoбавленo в 12.12: Писал модуль для автоматической проверки обновлений программы на сервере, где перебирал номера версий и подставлял в имя файла, если есть такого размера файл на сервере с максимальной версией, значит обновление есть. А то раньше закачивал спец. текстовый файлик с версией и проверял и правил его. ------------ Дoбавленo в 12.36: Вот, тут схожая проблема описана и ответ на нее. http://www.sql.ru/forum/423601/drobnye-chisla-16-16-ne-vypolnyaetsya i := i + 0.1; - по моему, один из первых примеров особеностей двоичного представления, это то, что числа вида 0.1 в двоичном виде представляют из себя бесконечную периодичную дробь. то есть, не могут быть представлены точно ------------ Дoбавленo в 12.41: Значит все дело именно в "опасном" числе 0.1. Потому что если его заменить на 0.2 то все работает без округления. HiAsm, теперь я готов с тобой лететь в черные дыры Космоса!)
|
|||
карма: 3 |
|
Ответов: 8947
Рейтинг: 824
|
|||
Aziz писал(а): дело именно в "опасном" числе 0.1![]() |
|||
карма: 19 |
|
Ответов: 1297
Рейтинг: 47
|
|||
Неужели все так плохо) Голова ни при чем, она либо глючит, либо учится)) Моя вроде научилась) Отсутствие знания этой специфики обработки и представления чисел - это уже прикладной аспект, вернее даже ограничения и несовершенства вычислительных инструментов..
|
|||
карма: 3 |
|
Ответов: 8947
Рейтинг: 824
|
|||
Леонид писал(а): ..можете сами проверить продолжив дроби..![]() |
|||
карма: 19 |
|
Ответов: 1297
Рейтинг: 47
|
|||
Да, признаюсь, не было времени вникать в двоичный код.. Но тем не менее провел эксперимент - только с 0.1 происходит глюк. Ставил и 0.2 и 0.3 - все путем. И потом коллеги по ссылке выше уже подтвердили особый статус этого числа. Это ускользающе малая величина или сравнимая с шумами погрешностей округления.. Я практик, мне пока этого достаточно..))
|
|||
карма: 3 |
|
12