Ручка неточности поплавка

У меня есть строка

strValue = "11.900000"

Я хочу разобрать его в значение с плавающей точкой. Итак, я попробовал:

float fValue = -1;
sscanf_s(strValue.c_str(), "%f", &fValue);

try
{
double test = std::stod(strValue, &sz);
fValue = (float) std::stod(strValue, &sz);
}
catch (...)
{
fValue = -1;
}

За double это точно:
тест = 11,900000000000000

За float неточно
fValue = 11.8999996

Есть ли возможность сделать это точно?
(Я знаю, что при работе с поплавками есть неточность, но есть ли лучший способ сделать это?)

1

Решение

Значение 11.8999996 является наиболее точным приближением 11.9 что может быть представлено float тип.

2

Другие решения

Единственный способ для вас — использовать десятичный тип с плавающей точкой. Если ваша платформа имеет FLT_RADIX == 10 тогда вы можете напрямую использовать float, но, очевидно, это не ваш случай, и я не знаю ни одной текущей системы, которая использует десятичное число с плавающей точкой кроме IBM z-серии.

Таким образом, вам нужен собственный тип для этого. Вы можете использовать некоторые библиотеки IEEE-754 decimal32, такие как Десятичная математическая библиотека Intel® с плавающей запятой или если вы используете GCC, он уже имеет поддержку десятичное число с помощью _Decimal32 тип

Вы можете найти больше информации в этом вопросе Как использовать десятичную (с плавающей точкой) в C ++?

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector