C ++长两倍大“安全”整数

时间:2018-10-27 23:55:36

标签: c++ numbers

IEEE 754数字不是均匀分布的,数字越大,两个连续可表示数字之间的差异越大。 我有C ++的long double大小是16字节。那么,可以用这种类型表示的更大的“安全”整数“ n”是什么? 如果可以表示n-1但不能表示n + 1,则将其称为“安全”。

3 个答案:

答案 0 :(得分:3)

IEEE 754标准定义了各种数值类型的参数:
https://en.wikipedia.org/wiki/IEEE_754 对于128位长的双精度数,尾数(浮点数中包含有效数字的部分)为113位,因此它可以表示精度最高为2 ^ 113-1的整数。它可以表示浮点数较大,但是由于较低的数字只是四舍五入,因此您开始失去精度。

答案 1 :(得分:2)

据我了解,您要问的是最大的连续可精确表示的整数。正是这样:

std::pow(std::numeric_limits<long double>::radix, std::numeric_limits<long double>::digits)

或以数学形式表示:基数 digits 其中(引自cppreference

  

std::numeric_limits<T>::radix的值是在类型表示中使用的数字系统的基数。对于所有二进制数字类型,该值为2,但是对于IEEE 754十进制浮点类型,它可以为,例如10。

     

std::numeric_limits<T>::digits的值是基数基数中可以由类型T表示而无需更改的位数。 ...对于浮点类型,这是尾数的位数

答案 2 :(得分:0)

在C ++中,您可以使用<limits>获得大量信息。例如:

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

int main() {
  auto p = std::numeric_limits<long double>::max_digits10;
  std::cout << "Max Long Double: "
            << std::setprecision(p)
            << std::setw(p + 7)
            << std::numeric_limits<long double>::max()
            << std::endl;
}

打印:

Max Long Double: 1.18973149535723176502e+4932