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