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

She*_*uti 5 c integer max long-double

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

// end of EDIT
Run Code Online (Sandbox Code Playgroud)

我试图了解我可以存储在long double.
我知道这取决于程序内置的环境,但我不知道具体如何。我有一个sizeof(long double) == 16值得的。

现在在这个答案中,他们说 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;
}
Run Code Online (Sandbox Code Playgroud)

即使在开始时添加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;
}
Run Code Online (Sandbox Code Playgroud)

但它打印0.
编辑:刚才我意识到我需要的条件!=for

总是在同一个答案中,他们说 double 的最大可能值是DBL_MAX或大约 1.8 x 10^308。
我不知道这是什么意思,但如果我跑

printf("%e\n", LDBL_MAX);
Run Code Online (Sandbox Code Playgroud)

每次我都会得到一个不同的值,它总是在 6.9 x 10^(-310) 左右。
编辑:我应该使用%Le,获得大约 1.19 x 10^4932 的值作为输出)
LDBL_MAX这里获取

我也试过这个

printf("%d\n", LDBL_MAX_10_EXP);
Run Code Online (Sandbox Code Playgroud)

这给出了值4932(我也在这个C++ 问题中找到了)。

由于 a 有 16 个字节long double,即使所有字节都用于类型的整数部分,我们也可以将数字存储到 2^128,即大约 3.4 x 10^ 38。所以我不明白 308、-310 和 4932 应该是什么意思。

有人能告诉我如何找出我可以存储的最大整数是long double多少吗?

Joh*_*ger 4

由于您在评论中表示您希望用作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);
}
Run Code Online (Sandbox Code Playgroud)

ldexp函数系列按 2 的幂缩放浮点值,类似于位移运算符 (<<>>) 对整数所做的操作,因此上面类似于

// not reliable for the purpose!
unsigned long long max_bit = 1ULL << (DBL_MANT_DIG - 1);
return max_bit + (max_bit - 1);
Run Code Online (Sandbox Code Playgroud)

然而,由于您认为您long double提供的尾数位多于您的long long值位,因此您必须假设位移位会溢出。

当然,您long double可以表达更大的值,所有这些值都是整数。但它们没有单位精度,因此long double当其值较大时,您的行为将偏离整数的预期行为。例如,如果long double变量包含较大的值,则和d中的至少一个可能评估为 true。d + 1 == dd - 1 == d