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

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Запись вещественных чисел в файл С++

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

Слива » 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.

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

Absurd » 13 дек 2017, 00:22

Если хочешь работать с плавающей запятой так же как и со строками произвольной длины, то нужна библиотека GMP https://gmplib.org/.
Если хочешь понять почему так бывает надо разобраться что такое "машинный эпсилон".

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

Влад.Променик » 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
и т.д.
с маленькими значениями такого нет а вот с большими есть.
Может кто подсказать что делать или какую библиотеку использовать?

Вернуться к началу