【问题标题】:maximum number of bits allowed after decimal point in long double in c++c++中long double中小数点后允许的最大位数
【发布时间】:2017-02-24 14:44:23
【问题描述】:

我解决了一个问题访问http://www.spoj.com/problems/CHI_ROOT/

(找到一个数的第 n 个根并打印结果的前 101 个有效数字 没有小数点,尾随和前导零)使用long double

sizeof(long double)=12;

因此为long double 变量分配的总位数为 96 位(12*8)。

变量可以存储的最大值约为 10^28。

我想知道变量在小数点后最多可以存储多少位 它是如何存储的?

【问题讨论】:

  • 大多数系统中的浮点数用IEEE floating point format表示。
  • 80 位,而不是 96 位,其中 64 位存储尾数。因此它可以表示 pow(2, 64) = 1.8E19 个不同的值。所以不要超过 19 位有效的十进制数字。在对值进行任何数学运算时,您将很快失去一个,只需将十进制转换为二进制,例如乘以并转换回十进制就足够了,因为该值需要四舍五入三倍。所以使用 18 作为实用值。

标签: c++ types double precision


【解决方案1】:

您可以通过查询the numeric_limits class template<cfloat> macros得到它可以准确显示的点后有效小数位数:

#include <limits>
#include <iostream>

int main() {
    std::cout << std::numeric_limits<float>::digits10 << std::endl;
    std::cout << FLOAT_DIG << std::endl;
    // 6
    std::cout << std::numeric_limits<double>::digits10 << std::endl;
    std::cout << DBL_DIG << std::endl;
    // 15
    std::cout << std::numeric_limits<long double>::digits10 << std::endl;
    std::cout << LDBL_DIG << std::endl;
    // 18
}

在 x86 上,long double 通常存储为extended precision 格式(只有 80 位,而不是 96 位;由于对齐,sizeof 被填充为 12 个字节)。

请注意,位数远小于101。您应该找出一种算法来计算任意精度的第n个根。

【讨论】:

    猜你喜欢
    • 2014-06-10
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    相关资源
    最近更新 更多