Есть у кого эффективный стабильный вариант? Максимум к чему пришел я:
I2R( R2I( r * 100000000.) ) * 0.00000001
Умножение на 10^-8 дает эквивалентный результат делению на 10^8.
Использование степеней менее чем 8я значительно увеличивает погрешность.
Использование приведенной формулы не исключает наращивание погрешности.
Использование степеней менее чем 8я значительно увеличивает погрешность.
Использование приведенной формулы не исключает наращивание погрешности.
Хотя, судя по всему, использование этой формулы увеличивает погрешность даже при 10^8.
Принятый ответ
Real в WarCraft работает абсолютно также, как float в C++ (фактически, это он и есть).
Математическое округление в принципе лучше делать по-другому:
#define fround = M_RoundFloat
#define round = M_Round
int M_Round(float number) {
if (number > 0) {
return R2I(number + 0.5);
}
if (number < 0) {
return R2I(number - 0.5);
}
return 0;
}
float M_RoundFloat(float number) {
if (number > 0.0) {
return I2R(R2I(number + 0.5));
}
if (number < 0.0) {
return I2R(R2I(number - 0.5));
}
return 0.0;
}
Так оно будет отрабатывать гарантировано верно и без тяжёлых операций.
Давно хотел куда-нибудь прилепить этот файлик, но всё не находилось случая, наконец-то!
Загруженные файлы
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Diaboliko
Только вот этот метод не подходит.
Отредактирован Clamp
Отредактирован Hanabishi
Отредактирован Clamp
В оригинале принимает не инт, а флоат, разумеется, выправил пост, раз уж он как ответ закреплён.