Запись вещественных чисел в файл С++

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Влад.Променик
Сообщения: 1
Зарегистрирован: 12 дек 2017, 22:19

12 дек 2017, 22:22

num = 0.067000000000000000000000000000;
x = 0.067000000000000000000000000000;
n = 0.000000000000000000000000000001;

while (x <= 0.100000000000000000000000000000)
{
x = x + n;
num = num + n;
file << std::setprecision(30) << std::fixed << num << std::endl;
}
в файле получаю значения
...
0.067000000000000003996802888651
0.067000000000000003996802888651
0.067000000000000003996802888651
....
а нужно
0.067000000000000000000000000001
0.067000000000000000000000000002
0.067000000000000000000000000003
и т.д.
с маленькими значениями такого нет а вот с большими есть.
Может кто подсказать что делать или какую библиотеку использовать?
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

13 дек 2017, 00:22

Если хочешь работать с плавающей запятой так же как и со строками произвольной длины, то нужна библиотека GMP https://gmplib.org/.
Если хочешь понять почему так бывает надо разобраться что такое "машинный эпсилон".
2B OR NOT(2B) = FF
Слива
Сообщения: 133
Зарегистрирован: 19 мар 2016, 10:15

15 дек 2017, 10:57

У меня получился вывод:

Код: Выделить всё

0.067000
0.067000
0.067000
0.067000
0.067000
0.067000
0.067000
0.067000
0.067000
0.067000
0.067000
0.067000
0.067000
0.067000
0.067000
0.067000
0.067000
0.067000
0.067000
0.067000
0.067000
Суть в отм, что во время этих операций:

Код: Выделить всё

x = x + n;
num = num + n;
n - это очень маленькое число и оно не прибавляется к x и num и они так и остаются 0.067, отсюда не работает цикл программы и крашится вся программа - виснет, если быть точным. Другие библиотеки и прочая муть тут не причем.
Это все связано с внутренним утройством вещественных чисел. Разберитесь и почитайте про это. Муть, кстати полнейшая. Видимо здесь не хватает просто мантиссы для осуществления операций и все. :D
Слишком сильно числа раскидали:
0.067000000000000000000000000000 и
0.000000000000000000000000000001.
Ответить