【发布时间】:2021-01-15 16:41:43
【问题描述】:
编辑:在 cmets 中进行了一些讨论后,结果表明,由于对如何在 C 中实现浮点数有一定的了解,我问了一些与我想问的不同的问题。
我想使用(使用)大于unsigned long long 的整数(对我来说是 8 个字节),可能不会重复到数组或 bigint 库。由于我的long double 是 16 个字节,我认为只需切换类型就可以了。结果表明,即使可以表示更大的整数,您也无法在不损失精度的情况下使用这些更大的long double 整数进行操作。所以不可能实现我想做的事情。实际上,正如 cmets 中所述,这对我来说是不可能的。但总的来说,是否可能取决于您的long double 的浮点特性。
// end of EDIT
我试图了解我可以存储在 long double 中的最大整数是多少。
我知道这取决于程序内置的环境,但我不知道具体如何。我有一个 sizeof(long double) == 16 值得一看。
现在在this answer 他们说 64 位双精度的最大值应该是 2^53,大约是 9 x 10^15,正好是 9007199254740992。
当我运行以下程序时,它就可以工作了:
#include <stdio.h>
int main() {
long double d = 9007199254740992.0L, i;
printf("%Lf\n", d);
for(i = -3.0; i < 4.0; i++) {
printf("%.Lf) %.1Lf\n", i, d+i);
}
return 0;
}
即使11119007199254740992.0L 与开头添加四个1s 的数字相同。但是,当我再添加一个 1 时,第一个 printf 会按预期工作,而其他所有显示的第一个打印件数量相同。
所以我试图用这个程序来获得我long double的最大价值
#include <stdio.h>
#include <math.h>
int main() {
long double d = 11119007199254740992.0L, i;
for(i = 0.0L; d+i == d+i-1.0; i++) {
if( !fmodl(i, 10000.0L) ) printf("%Lf\n", i);
}
printf("%.Lf\n", i);
return 0;
}
但它会打印0。
(编辑:我刚刚意识到我需要for 中的条件!=)
总是在相同的答案中,他们说双精度的最大可能值是DBL_MAX 或大约 1.8 x 10^308。
我不知道这是什么意思,但是如果我运行
printf("%e\n", LDBL_MAX);
我每次都会得到一个不同的值,始终在 6.9 x 10^(-310) 左右。
(编辑:我应该使用 %Le,得到一个大约 1.19 x 10^4932 的值)
我从here 取了LDBL_MAX。
我也试过这个
printf("%d\n", LDBL_MAX_10_EXP);
这给出了4932 的值(我也在this C++ 问题中找到了)。
由于long double 有 16 个字节,即使它们都是类型的整数部分,我们也可以将数字存储到 2^128,即大约 3.4 x 10^ 38。所以我不明白 308、-310 和 4932 应该是什么意思。
有人能告诉我如何找出可以存储为long double 的最大整数吗?
【问题讨论】:
-
这取决于整数是否有任何
2因子,这些因子将被指数占用。简单的答案是指定有效位(加 1)的数量,用于无损存储整数值。指数表示可以近似表示的所有值的范围。 -
在
printf("%e\n", LDBL_MAX);中你的意思是使用%Le? -
有几种方法可以解释这个问题,所有这些方法都会产生不同的结果。例如,
long double可以存储的 所有 个最大值都是整数,特别是,LDBL_MAX是一个整数。但是在大多数实现中没有内置的整数整数数据类型可以表示该值。 -
4932不是直接与浮点类型的 16 字节相关,而是10^4932来自指数部分的位数。 -
“所以不可能实现我想做的事情。” --> 不正确。这取决于
long double的浮点特性。使用LDBL_MANT_DIG == 64,代码可以影响int65_t之类的操作。
标签: c integer max long-double