Заметил, что данные функции дают разные ответы при 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?

Принятый ответ

Clamp:
Статью уже кидали, ответа на вопрос там нет.
Давно видел эту статейку на HIVE, думал, что её уже давно кинут сюда)
Там и есть ответы на интересующие меня вопросы.
Вот тут ещё об этом.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
18
6 лет назад
0
PT153 насчет округления - через DebugMsg тестил)
А насчет 4 чисел после запятой - отсюда xgm.guru/p/wc3/w3datatypes
Из строчки "Константно может быть задан в виде числа с точкой (1.2345)"
0
28
6 лет назад
0
UrsaBoss, спасибо за статью, а вот что я выяснил своими тестами:
  1. R2SW(r, 0, -1) возвращает столько знаков после запятой, сколько есть (до 6).
  2. R2I(9.999999) = 9, если бы округлялось после 4-х знаков, то ответ был бы 10.
  3. R2I(9.9999999) и далее выдаёт 10.
  4. R2I(9.9999998) = 9.
Судя по статье, real == float, у которого всего 7.22 десятичных разряда, то есть округление происходит не всегда после 4-го знака за запятой.
0
30
6 лет назад
Отредактирован Clamp
0
0
23
6 лет назад
0
не проще добавить 0.5 или отнимать
2
20
6 лет назад
2
PT153:
UrsaBoss, спасибо за статью, а вот что я выяснил своими тестами:
  1. R2SW(r, 0, -1) возвращает столько знаков после запятой, сколько есть (до 6).
  2. R2I(9.999999) = 9, если бы округлялось после 4-х знаков, то ответ был бы 10.
  3. R2I(9.9999999) и далее выдаёт 10.
  4. R2I(9.9999998) = 9.
Судя по статье, real == float, у которого всего 7.22 десятичных разряда, то есть округление происходит не всегда после 4-го знака за запятой.
Просто близы решили что высокая точность не нужна
0
23
6 лет назад
0
и кстати делай на int так лучше например у мя 0.0505 это как 505 int и проблем нет...
то есть 505/10000 = 0.0505
0
18
6 лет назад
0
pro100master:
и кстати делай на int так лучше например у мя 0.0505 это как 505 int и проблем нет...
то есть 505/10000 = 0.0505
не очень удобно если делать дофига вычислений
+ это лишняя нагрузка, кому то покажется что это не нагрузка, но всё равно лишнее
0
23
6 лет назад
0
UrsaBoss, скажи зачем вам столько байтов... для процента вполне 10000 int максимум как во всех популярных играх к примеру l2 имеет 1000000 int рандом
2
29
6 лет назад
2
0
28
6 лет назад
Отредактирован PT153
0
Clamp:
Статью уже кидали, ответа на вопрос там нет.
Давно видел эту статейку на HIVE, думал, что её уже давно кинут сюда)
Там и есть ответы на интересующие меня вопросы.
Вот тут ещё об этом.
Принятый ответ
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.