Каково максимально точное представимое значение для заданного двойного значения на станке?

#c #floating-point #epsilon

Вопрос:

Пара вопросов из кода ниже:

а) Что означает std::numeric_limits::digits10? б) Если (а) представляет собой максимальное 10-значное двойное число, которое можно повторно представить на машине, то мы можем продолжать получать все большую и большую точность, просто добавляя 1, 2, а затем каково максимальное двойное значение, которое можно повторно представить на машине? Как это можно отобразить? т. е. какой std::numeric_limits::digits10 maxN?

 #include <iostream>
#include <iomanip>
#include <cmath>
#include <limits>


int main(void)
{
  double d1 = 0.1;
  double d2 = 0.2;
  double d3 = d1   d2;
  std::cout << std::setprecision(std::numeric_limits<long double>::digits10   1) << "Sum 0.1   0.2 = " << d3 << std::endl;
  std::cout << std::setprecision(std::numeric_limits<long double>::digits10   2) << "Sum 0.1   0.2 = " << d3 << std::endl;
  std::cout << std::setprecision(std::numeric_limits<long double>::digits10   3) << "Sum 0.1   0.2 = " << d3 << std::endl;
  std::cout << std::setprecision(std::numeric_limits<long double>::digits10   4) << "Sum 0.1   0.2 = " << d3 << std::endl;
  return 0;
}
 

Комментарии:

1. Пожалуйста , помните, что существует ОГРОМНАЯ разница между «точностью» при печати числа (например std::setprecision , в основном просто «представление») и ФАКТИЧЕСКОЙ математической точностью, доступной в вашем числе с плавающей запятой ( std::numeric_limits ). Чтобы ответить на ваш вопрос: digits10: Number of digits (in decimal base) that can be represented without change. Equivalent to FLT_DIG, DBL_DIG or LDBL_DIG for floating types.

2. @paulsm4 — Что вы подразумеваете под «цифрами 10: количество цифр (в десятичной системе счисления), которые могут быть представлены без изменений». Что означает «представление без изменений»? Кто что меняет?

3. Когда вы преобразуете действительное число в fp, цифры начинают отличаться от некоторой позиции из-за конечной точности. Те, кто находится до этой позиции, представлены «без изменений».

4. Это обеспечит некоторый фон Для Самой Короткой Десятичной Строки, Которая Может Быть Не Самой Близкой . Другие статьи на сайте, помеченные Floating-point тегами, предоставят больше информации (и заставят вашу голову болеть) Об изучении двоичных чисел с плавающей запятой .

Ответ №1:

Что std::numeric_limits::digits10 denote?

double обычно он 64-разрядный и может точно представлять около 2 64 различных значений.

Текст типа "0.1" , "3.1415926535897932384626433832795" , и т.д. обладает бесконечными возможностями.

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

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

numeric_limits<double>::digits10 (например, 15)-это то N, которое допускает все успешные обходы.


Каково максимально точное представимое значение для заданного двойного значения на станке?

Типичный double кодируется с использованием базы-2 и имеет максимальную точность 53 значащих двоичных цифр.

можно продолжать получать все больше и больше точности, просто добавляя …

Выберите double значения, записанные в десятичной системе счисления, для N точной записи требуется больше значащих цифр. Я бы сказал, примерно до 754.

Записи a double до numeric_limits<double>::max_digits10 (например, 17) значащих десятичных цифр достаточно, чтобы отличить его от всех остальных double .

Функция преобразования качества double в текст обязательно и правильно запишет не менее max_digits10 десятичных цифр. Кроме того, все зависит от реализации. Чтобы соответствовать стандарту IEEE 754, я уверен, что минимум таков max_digits10 3 .


numeric_limits<double>::digits10 отличается от numeric_limits<double>::max_digits10 , потому double что кодировка с использованием базы 2 отличается от текста в качестве базы 10. double Значения не очень хорошо распределены по базовым 10 значениям.

Комментарии:

1. Приведенное ниже утверждение пролетело у меня над головой —> «numeric_limits><double>::digits10 отличается от numeric_limits<double><double>::max_digits10, потому что двойная кодировка с использованием базы 2 отличается от текста в качестве базы 10. Двойные значения не очень хорошо распределены по базовым 10 значениям».