Точность вывода выше двойной - PullRequest
4 голосов
/ 30 сентября 2011

Я печатаю некоторые данные из программы на C ++ для обработки / визуализации в ParaView, но у меня проблема с числами с плавающей запятой. Paraview поддерживает оба типа данных: Float32 и Float64. Float64 эквивалентно double с типичными пределами +/- 1.7e +/- 308. Но мой код печатает числа вроде 6.5e-318. Это вызывает ошибки в ParaView при чтении данных. Я убедился, что округление этих малых чисел до нуля приводит к исчезновению ошибок в ParaView. Я не уверен, почему у меня такой «высокоточный» вывод, возможно, потому, что некоторые числа хранятся с большей точностью, чем double. Например, следующий код воспроизводит такое же поведение в моей системе:

#include <iostream>
int main(void)
{
  const double var1 = 1.0e-318, var2 = 1.5e-318;
  std::cout << 1.0e-318 << std::endl; 
  std::cout << var1 << std::endl; 
  std::cout << var1 - var2 << std::endl; 
  std::cout.setf(std::ios_base::fixed | std::ios_base::scientific, std::ios_base::floatfield);
  std::cout << 1.0e-318 << std::endl; 
  std::cout << var1 << std::endl; 
  std::cout << var1 - var2 << std::endl; 

  return 0;
}

Мой вывод:

9.99999e-319
9.99999e-319
-4.99999e-319
9.99999e-319
9.99999e-319
-4.99999e-319

Моя система - Mac OS X Snow Leopard, и я протестировал вышеупомянутое с GCC 4.2 и GCC 4.6 с флагами -m32, -m64 и -ffloat-store (не уверен, полезно ли это).

На самом деле вывод для меня в порядке, но для ParaView - нет. Я просто хочу знать, почему у меня такая разница. Я, скорее всего, игнорирую что-то связанное с числами с плавающей запятой, что может быть важно. Не могли бы вы, пожалуйста, дать мне некоторую подсказку об этом выходном / числовом поведении для парных чисел?

1 Ответ

11 голосов
/ 30 сентября 2011

Субнормальные числа, то есть числа с наименьшим возможным показателем степени и ведущими нулями в дроби, может быть меньше 1E-308, вплоть до 1E-324 . Вы, вероятно, можете отфильтровать их, используя std :: numeric_limits.

...