Добавлен PT153
Заметил, что данные функции дают разные ответы при r = 9.9999, например.
function R2IX takes real r returns integer
local integer i = R2I(r)
if r - I2R(i) >= 1. then
return i + 1
endif
return i
endfunction
// Ответ: 9.
function R2IY takes real r returns integer
local integer i = R2I(r)
if r - I2R(i) == 1. then
return i + 1
endif
return i
endfunction
// Ответ: 10.
Почему так происходит? Какие операции сравнения (==, !=, >, <, >=, <=) лучше использовать для типа real?
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.

WC3




В вц3 следует сравнивать с диапазоном. x <= z and x >= y. Либо с R2I(x * 10^y)
Подробнее можно прочитать, например, на хабре
Ред. Hodor
К примеру: 9.9999 станет 10.000, или 1.0001 станет 1.000
Ред. PT153
UrsaBoss, ты написал такую же функцию, что и у меня в вопросе (только разделил => на > и ==). Причём тут 9.9999/2?
Я повторю вопросы ещё раз:
- Почему когда я использую >= получаю верный ответ, а когда ==, то неверный, хотя => сильнее ==? R2I(9.9999) = 9, это я проверял, тогда 9.9999 - 9.0 == 1 выдаёт правду, но 9.9999 - 9.0 >= 1 выдаёт ложь. Как так?
- Какие операции сравнения (==, !=, >, <, >=, <=) лучше для действительных чисел в JASS (слышал и убедился сам, что сравнение через == плохо)?
Я знаю про стандарт IEEE754 и про неточность арифметических действий с float, меня интересует лишь сравнение этих чисел конкретно в JASS.Ред. Hodor
Ред. PT153
Мне и 4-х цифр после запятой хватит, да и вопрос не в этом, но источник информации хочется узнать.
А насчет 4 чисел после запятой - отсюда xgm.guru/p/wc3/w3datatypes
Из строчки "Константно может быть задан в виде числа с точкой (1.2345)"