Добавлен 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




А насчет 4 чисел после запятой - отсюда xgm.guru/p/wc3/w3datatypes
Из строчки "Константно может быть задан в виде числа с точкой (1.2345)"
- R2SW(r, 0, -1) возвращает столько знаков после запятой, сколько есть (до 6).
- R2I(9.999999) = 9, если бы округлялось после 4-х знаков, то ответ был бы 10.
- R2I(9.9999999) и далее выдаёт 10.
- R2I(9.9999998) = 9.
Судя по статье, real == float, у которого всего 7.22 десятичных разряда, то есть округление происходит не всегда после 4-го знака за запятой.Ред. Clamp
то есть 505/10000 = 0.0505
+ это лишняя нагрузка, кому то покажется что это не нагрузка, но всё равно лишнее
Ред. PT153
Давно видел эту статейку на HIVE, думал, что её уже давно кинут сюда)
Там и есть ответы на интересующие меня вопросы.
Вот тут ещё об этом.