【发布时间】:2017-02-11 14:20:52
【问题描述】:
如果可以输出浮点数,从而不会截断值(例如setpercision),并且数字以固定表示法输出(例如fixed),那么缓冲区大小是多少是否需要保证浮点数的整个小数部分都可以存储在缓冲区中?
我希望标准中有一些东西,比如 #define 或 numeric_limits 中的东西,它会告诉我浮点类型小数部分的最大基数为 10 值的位置。
我在这里询问了浮点类型小数部分中基数为 10 位的最大位数:What Are the Maximum Number of Base-10 Digits in the Integral Part of a Floating Point Number
但我意识到这可能更复杂。例如,1.0 / 3.0 是一个无限重复的数字序列。当我使用fixed 格式输出时,我会在重复 0 之前得到这么多地方:
0.333333333333333314829616256247390992939472198486328125
但我不一定说这是最大精度,因为我不知道有多少尾随的 0 实际表示在浮点分数中,并且它没有被负指数向下移动。
我知道我们有 min_exponent10 这是我应该寻找的吗?
【问题讨论】:
-
base-10 的最大位数是什么意思?
2^-100有 100 个以 10 为底的非零数字,在double中精确表示。 -
double 的尾数可以存储 53 位,因此它可以有 pow(2,53) = 9E15 个不同的值。所以永远不能超过 log10(9E15) ~= 15.95 有效数字。明智地四舍五入到 15。只需将它们算在你得到的值中。
-
@JonathanMee 因此,您需要编写函数的最大精度,而不是内存中的数字表示。现在问题很清楚了,但很遗憾,我不知道答案
-
我想你想要(例如
double),DBL_MANT_DIG - DBL_MIN_EXP(假设FLT_RADIX是2)。对于 IEEE 754 binary64 double,这给出了1074的值。对于这种格式,小数点后的1074数字对于能够表示任何double的精确值都是必要且足够的。 (5e-324是最后一个非零有效数字在10^{-1074}位置的情况。) -
@JonathanMee 老实说,我不得不在聊天时寻求帮助,其中一个建议是:为了将任何双精度值存储为十进制表示,我的缓冲区应该有多大? 这是你的问题吗?
标签: c++ floating-point max decimal numeric-limits