Как определить, является ли строка из файла float или double в C ++? - PullRequest
0 голосов
/ 25 февраля 2019

Я хотел бы проанализировать файл и определить, является ли прочитанное число float или double.Файл, который я анализирую, является одной из матриц в формате Matrix Market (например: https://sparse.tamu.edu/HB/1138_bus).

В основном входные данные находятся в следующем порядке: int int float (or double):

1138 1138 2596
1 1 1474.779
5 1 -9.017133
563 1 -5.730659
2 2 9.136654
10 2 -3.405995

и т.д ...

Когда я читаю число с плавающей точкой, я хотел бы определить, может ли число храниться в float или ему нужно что-то большое, например double.

Есть ли какой-нибудь лучший способ чтения и в то же время определения, может ли строка храниться в float или double?

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Проблема с чтением десятичных значений состоит в том, что не просто определить, просто взглянув на них, достаточно ли точности у float.

Например, 1.0009765625 будет фиксироваться точно в floatно 1.1 не совсем подходит для double (или любого другого двоичного типа с плавающей запятой).

Лучше всего всегда использовать double при чтении в типах с плавающей запятой.float в целом следует избегать, если у вас нет для этого особой причины.

0 голосов
/ 25 февраля 2019

То, что вы делаете, определенно возможно, но зачем вам это нужно?

Гигабайт может хранить 250 миллионов поплавков.Гигабайт может хранить 125 миллионов дублей.Если вам нужно поразить цели так высоко, у вас будут проблемы с производительностью, прежде чем вам понадобится больше места.

Зачем вам нужна точность?Если вы делаете проект калькулятора или что-то, где важна точность вплоть до самых маленьких размеров чисел, вы должны вместо этого использовать пользовательский тип данных, подобный этому, для обработки числовых взаимодействий:

https://gmplib.org/

Преимущество здесь в том, что он может быть динамически изменен и не округлять числа, что в конечном итоге придется делать как с удвоением, так и с плавающей точкой.

Однако, если вы не уверены в своем методе, я бы рекомендовал прочитать вашу строку и проверить размер строки.Если оно равно 7 или больше, храните его как двойное, если оно меньше 7 цифр, храните его как число с плавающей запятой.Все, что больше 15 цифр, будет усечено.

0 голосов
/ 25 февраля 2019

Вы можете проверить количество цифр от 10 до 10 в числе, которое вы анализируете.Если оно больше std::numeric_limits<float>::digits10, тогда лучше использовать double.

любое число с таким количеством значащих десятичных цифр можно преобразовать в значение типаT и обратно в десятичную форму, без изменений из-за округления или переполнения

Это означает, что вы получите точно свой номер до последней значащей цифры.Остальное ненадежно из-за округления и переполнения.

Правило большого пальца:

  • Одиночная точность IEEE-754 (с плавающей запятой) может хранить около 7 десятичных цифр
  • IEEE-754 двойной точности (double) может хранить до 16 десятичных цифр

В вашем примере float достаточно достаточно для store число :

если вы сохраните первые семь десятичных цифр числа с плавающей точкой в ​​файле, они гарантированно будут точно такими же, как и в оригинальном номере.Однако, если вы сделаете какие-либо манипуляции с этим числом, результат будет подвержен ошибкам округления, которые являются предметом всей области численного анализа.

...