gpt4 book ai didi

c - 可以存储在 long double 中的最大整数

转载 作者:行者123 更新时间:2023-12-03 16:09:45 24 4
gpt4 key购买 nike

编辑:在评论中进行了一些讨论后发现,由于在 C 中如何实现浮点数方面的知识运气好,我问了一些与我想问的不同的问题。
我想使用(使用)比我可以使用的整数更大的整数 unsigned long long (对我来说是 8 个字节),可能不会重复到数组或 bigint 库。由于我的 long double是 16 个字节,我认为只需切换类型就可以实现。结果表明,即使可以表示更大的整数,您也不能使用这些更大的 long double 进行运算。整数 - 不会丢失精度。所以不可能实现我想做的事情。实际上,正如评论中所述,这对我来说是不可能的。但总的来说,是否可能取决于您的 long double 的浮点特性.

// end of EDIT
我试图了解我可以存储在 long double 中的最大整数是多少.
我知道这取决于程序内置的环境,但我不知 Prop 体如何。我有一个 sizeof(long double) == 16为了什么是值得的。
现在在 this answer他们说 64 位 double 的最大值应该是 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这是与四个相同的数字 1 s 在开始时添加。但是当我再添加一个时 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 中)
总是在同一个答案中,他们说 double 的最大可能值是 DBL_MAX或大约 1.8 x 10^308。
我不知道这是什么意思,但如果我跑
printf("%e\n", LDBL_MAX);
每次我都会得到一个不同的值,它总是在 6.9 x 10^(-310) 左右。
( 编辑 :我应该使用 %Le ,得到大约 1.19 x 10^4932 的值作为输出)
我拿了 LDBL_MAX来自 here .
我也试过这个
printf("%d\n", LDBL_MAX_10_EXP);
这给出了值 4932 (我也在 this C++ 问题中找到了)。
因为我们有 16 个字节用于 long double ,即使它们都是类型的整数部分,我们也可以将数字存储到 2^128,即大约 3.4 x 10^ 38 .所以我不明白 308、-310 和 4932 应该是什么意思。
有人能告诉我如何找出我可以存储为 long double 的最大整数是多少吗? ?

最佳答案

只要你在评论中表达你想使用 long double代替 long long为了获得更大的范围,我假设您还需要单位精度。因此,您要求浮点表示 ( LDBL_MANT_DIG ) 的基数中可用尾数位数 ( FLT_RADIX ) 表示的最大数。在极有可能发生的情况下FLT_RADIX == 2 ,您可以像这样计算该值:

#include <float.h>
#include <math.h>

long double get_max_integer_equivalent() {
long double max_bit = ldexpl(1, LDBL_MANT_DIG - 1);
return max_bit + (max_bit - 1);
}
ldexp函数族按 2 的幂缩放浮点值,类似于位移运算符( <<>> )对整数所做的操作,因此上面类似于
// not reliable for the purpose!
unsigned long long max_bit = 1ULL << (DBL_MANT_DIG - 1);
return max_bit + (max_bit - 1);
只要您假设您的 long double提供比您的 long long 更多的尾数数字有值位,但是,您必须假设位移位会溢出。
当然,还有比您的 long double 大得多的值。可以表示,都是整数。但是它们没有单位精度,因此您的行为 long double当其值较大时,将偏离整数的预期行为。例如,如果 long double变量 d包含大于 d + 1 == d 中至少一个的值和 d - 1 == d很可能会评估为真。

关于c - 可以存储在 long double 中的最大整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65740060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com