c++ - C++ 中 float、double 或 long double 的精度是什么意思?

标签 c++ floating-point precision

例如,在此表中,他们说 7 位数字为浮点型,15 位数字为 double 型: https://learn.microsoft.com/en-us/cpp/cpp/data-type-ranges

但是这个语句返回 9:

std::cout << std::numeric_limits<float>::max_digits10 << '\n';

添加此返回 17:

std::cout << std::numeric_limits<double>::max_digits10 << '\n';

也许我们应该从位数中减去+或-号以及点? 在这里他们说这种精度保证在文本 -> 数字 -> 文本转换后保留数字: https://en.cppreference.com/w/cpp/types/numeric_limits/max_digits10

但是当我这样做时,精度始终为 7,在 double 的情况下也是:

#include <iostream>
#include <string>
int main() {
  double d_example = 0.123456789;
  std::string str_example = std::to_string(d_example);
  d_example = stod(str_example);
  std::cout << str_example << '\n';
  std::cout << d_example << '\n';
}

最佳答案

这些数字是不同操作的特征。

最大十进制位数 ( numeric_limits<>::max_digits10 ):如果将 float 转换为具有至少那么多十进制位数(不包括句点等非数字字符)的字符串,然后返回一个数字,结果数字保证等于原始数字。

十进制数字 ( numeric_limits<>::digits10 ):如果最多那么多十进制数字(不包括非数字字符,如句点)的字符串转换为 float ,然后再转换回来对于具有相同小数位数的字符串,结果字符串保证与原始字符串表示相同的数字。

单精度 float 的十进制数字值实际上是 6,而不是 7。有时非正式地给出为 7,因为大多数 7 位字符串的测试都会成功。

关于c++ - C++ 中 float、double 或 long double 的精度是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66986911/

相关文章:

c++ - Qt qInstallMessageHandler编码

C++ - const 参数和类变量是悲观化的吗?

c - 非规范化 float 被检测为 NaN。为什么?

c++ - 整数在 float 中的精确表示

c++ - boost set_filter 不工作

c++ - 为什么速记符号在课外不起作用?

c - C 中的编号 622.08E6 解释

javascript - 确定数值是否在非特定整数的某个范围内

将小数点后的值转换为较小的精度

c++ - acos(double) 在 x64 和 x32 Visual Studio 上给出不同的结果