#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 значениям».