Как я делаю плавающую точку, округляющуюся с предвзятостью (всегда окружают или вниз)?

может быть, вам стоит попробовать регулярные выражения в вашем IDimg, если вы знаете, какой будет ожидаемый ввод, и предварительно сопоставить его

7
задан user4891 8 April 2009 в 14:29
поделиться

1 ответ

Я думаю лучший способ достигнуть, это должно полагаться на то, что согласно стандарту плавающей точки IEEE 754, целочисленное представление битов с плавающей точкой лексикографически заказано как целое число с 2 дополнениями.

Т.е. Вы могли просто добавить один ulp (единицы в последнем месте) для получения следующего представления с плавающей точкой (который всегда будет немного больше, чем treshold, если это было меньше, так как ошибка округления в большей части 1/2 ulp),

например.

 float floatValue = 7.f/10;
 std::cout << std::setprecision(20) << floatValue << std::endl;
 int asInt = *(int*)&floatValue;
 asInt += 1;
 floatValue = *(float*)&asInt;
 std::cout << floatValue << std::endl;

печать (в моей системе)

 0.69999998807907104492
 0.70000004768371582031

Для знания, когда необходимо добавить один ulp необходимо будет полагаться на различие floor и округленный floor

 if (std::floor(floatValue * 100.) != std::floor(floatValue * 100. + 0.5)) {
    int asInt = *(int*)&floatValue;
    asInt += 1;
    floatValue = *(float*)&asInt;
 }

Правильно преобразовал бы 0.69.. к 0,70.. но отпуск 0.80.. один.

Обратите внимание, что плаванию способствуют на двойное через умножение с 100. перед floor применяется.

Если Вы не делаете этого, Вы рискуете входить в ситуацию это для

 7.f/10.f * 100.f

(Ограниченный в точности) представление плавающее было бы 70.00...

11
ответ дан 6 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: