Заметил, что данные функции дают разные ответы при 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, думал, что её уже давно кинут сюда)
Там и есть ответы на интересующие меня вопросы.
Вот тут ещё об этом.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
28
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-го знака за запятой.
20
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-го знака за запятой.
Просто близы решили что высокая точность не нужна
22
и кстати делай на int так лучше например у мя 0.0505 это как 505 int и проблем нет...
то есть 505/10000 = 0.0505
18
pro100master:
и кстати делай на int так лучше например у мя 0.0505 это как 505 int и проблем нет...
то есть 505/10000 = 0.0505
не очень удобно если делать дофига вычислений
+ это лишняя нагрузка, кому то покажется что это не нагрузка, но всё равно лишнее
22
UrsaBoss, скажи зачем вам столько байтов... для процента вполне 10000 int максимум как во всех популярных играх к примеру l2 имеет 1000000 int рандом
28
Clamp:
Статью уже кидали, ответа на вопрос там нет.
Давно видел эту статейку на HIVE, думал, что её уже давно кинут сюда)
Там и есть ответы на интересующие меня вопросы.
Вот тут ещё об этом.
Принятый ответ
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.