Ошибки вычисления с плавающей точкой в LUA.

Страницы: 1
RSS
Ошибки вычисления с плавающей точкой в LUA., LUA не может правильно посчитать 124.4 - 124.3? - Да ладно?!
 
Нет, я все понимаю, деление или умножение чисел с плавающей точкой могут приводит к бесконечным десятичным дробям и соответственно ошибкам округления.

Но здесь!
Код
x = tonumber(124.4 - 124.3);
Результат: x = 0.10000000000001

И что делать то?
 
Собственно проблемы практического плана возникают в таких местах:
Код
124.4==(124.3+0.1)
Результат: false
 
Если более конкретно, берем цену из Квика, прибавляем шаг цены инструмента, сравниваем со следующей ценой, а они не равны.

Как вы боретесь с такой бедой?
 
Цитата
Денис написал:
Если более конкретно, берем цену из Квика, прибавляем шаг цены инструмента, сравниваем со следующей ценой, а они не равны.

Как вы боретесь с такой бедой?
вообще-то, это простейшая задача для обучающегося программированию.
Посмотрите учебники по программированию,
оно конечно читать надобно.
 
Здравствуйте,
Числа с плавающей точкой нужно сравнивать с заданной точностью.
Это особенность типа данных, про которую в интернете очень много статей
 
Цитата
Николай Камынин написал:
Цитата
Денис   написал:
Если более конкретно, берем цену из Квика, прибавляем шаг цены инструмента, сравниваем со следующей ценой, а они не равны.

Как вы боретесь с такой бедой?
вообще-то, это простейшая задача для обучающегося программированию.
Посмотрите учебники по программированию,
оно конечно читать надобно.
Вообще-то такое решение никому не интересно, писать собственный оператор для умножения чисел. Нафиг тогда нужен оператор умножения, если свой писать нужно. Интересуют естественно встроенные возможности языка. Садитесь, два и больше глупости не пишите.

Следующий после вас человек дал хороший ответ. Спасибо ему за это! Посмотрю как сравнивать с заданной точностью.
 
Цитата
Sergey Gorokhov написал:
Здравствуйте,
Числа с плавающей точкой нужно сравнивать с заданной точностью.
Это особенность типа данных, про которую в интернете очень много статей
Спасибо!
 
Цитата
Денис написал:
Садитесь, два и больше глупости не пишите.

Следующий после вас человек дал хороший ответ. Спасибо ему за это! Посмотрю как сравнивать с заданной точностью.
Вообще-то это два ответа об одном и том же.
Но узнать (и осознать) это станет возможно только после следования первому совету.
 
Уже спрашивал подобное.
https://forum.quik.ru/messages/forum10/message15026/topic1654/#message15026
Это проблема не Quik'а, а операций с плавающей точкой, и актуально это для всех низкоуровневых языков программирования
 
Цитата
Вячеслав + написал:
Уже спрашивал подобное.
https://forum.quik.ru/messages/forum10/message15026/topic1654/#message15026
Это проблема не Quik'а, а операций с плавающей точкой, и актуально это для всех низкоуровневых языков программирования
это проблема не квик и не низкоуровневых языков, это проблема лишь дилетантов, а у знающих - это особенность хранения числе с плавающей точкой.
---------------------------------------------------------------------------------------------------
Денис,
читайте учебники, а не гордитесь собственным невежеством.
 
Скрытый текст

Денис,
Код
nul = 0.000000001
function math.compare(x, y)
  return math.abs(x - y) < nul
end
Надо делать так, как надо. А как не надо - делать не надо.
 
Есть прекрасная статья - ну кто хочет разобраться, конечно, а не готовый рецепт получить, а потом удивляться, почему он не работает у меня. (ответ: потому что не подходит)

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374

Важно осознать что там вовсе не про дельфи. Всё описанное там не зависит от языка вообще, это особенность представления в двоичном компьютере (а других у нас нет) так называемых "чисел с плавающей точкой".

Для Lua - разумеется тоже подходит с той лишь поправкой, что в том Lua, который у нас есть в рамках QUIK,  у нас в принципе всего один тип числовых переменных, и это - Double.
Страницы: 1
Читают тему
Наверх