当前位置: 首页 > 知识库问答 >
问题:

可以存储在长双精度中的最大整数

水瀚漠
2023-03-14

编辑:在评论中进行了一些讨论后,发现由于幸运地了解了浮点数是如何在C中实现的,我问了一些与我想问的不同的东西。
我想使用比无符号长更大的整数(对我来说是8个字节)(对我来说是8个字节),可能不会重复出现在数组或bigint库中。由于我的长双是16个字节,我认为只需切换类型就可以了。结果表明,即使可以表示更大的整数,你也不能在不失去精度的情况下进行操作——用这些更大的Long双整数。所以不可能实现我想做的事情。实际上,正如评论中所说,对我来说是不可能的。但总的来说,阉羊是否可能取决于你的长双的浮点特性。

// end of EDIT

我试图了解我可以存储在长双精度中的最大整数是多少。
我知道这取决于程序内置的环境,但我不知道具体如何。我有一个大小(长双倍)== 16 值得。

在这个答案中,他们说64位双精度值的最大值应该是2^53,大约是9倍10^15,正好是9007199254740992。< br >当我运行以下程序时,它就工作了:

#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的相同数字。但是当我再添加一个1时,第一个printf按预期工作,而所有其他的都显示了第一个打印的相同数字。
所以我试图用这个程序获得我的长双精度的最大值

#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的输出值)
我从这里获取了LDBL_MAX

我也试过这个

printf("%d\n", LDBL_MAX_10_EXP);

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

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

有人能够告诉我如何找出我可以存储为长双精度的最大整数是多少?

共有3个答案

朱高超
2023-03-14

假设您指的是“存储而不丢失信息”,< code>LDBL_MANT_DIG给出了用于浮点尾数的位数,因此这就是一个整数值可以存储多少位而不丢失信息。*

您需要128位整数来轻松确定128位浮点中可以保存的最大整数值,但这至少会发出十六进制值(这假设unsignedlong-long是64位-您可以使用CHAR_bitsizeof(unsigned-long)来获得可移植的答案):

#include <stdio.h>
#include <float.h>
#include <limits.h>


int main( int argc, char **argv )
{
    int tooBig = 0;
    unsigned long long shift = LDBL_MANT_DIG;
    if ( shift >= 64 )
    {
        tooBig = 1;
        shift -= 64;
    }

    unsigned long long max = ( 1ULL << shift ) - 1ULL;

    printf( "Max integer value: 0x" );

    // don't emit an extraneous zero if LDBL_MANT_DIG is
    // exactly 64
    if ( max )
    {
        printf( "%llx", max );
    }

    if ( tooBig )
    {
        printf( "%llx", ULLONG_MAX );
    }

    printf( "\n" );

    return( 0 );
}

*-从字面上讲,它是FLT_RADIX基数中的位数,但这个基数几乎可以肯定是2。

戎俊
2023-03-14
匿名用户

您可以使用< code>limits.h在机器上打印最大值,该值为< code>ULLONG_MAX

https://www.geeksforgeeks.org/climits-limits-h-cc/是一个C示例。

使用 printf() 打印无符号长长整型的格式说明符是 %llu,用于打印长双精度为 %Lf

printf("unsigned long long int: %llu ",(unsigned long long) ULLONG_MAX);

printf("long double: %Lf ",(long double) LDBL_MAX);

https://www.tutorialspoint.com/format-specifiers-in-c

也在打印无符号长整型值类型时返回奇怪的结果

袁智明
2023-03-14

因为您在注释中表示您想使用何处双作为何处长的替代品以获得更大的范围,我假设您也需要单位精度。因此,您要求的最大数字可由浮点表示(FLT_RADIX)的基数中可用的尾数位数(LDBL_MANT_DIG)表示。在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);

因为您认为您的长双精度提供的尾数位数比您的长长的值位多,但是,您必须假设位移位会溢出。

当然,您的<code>long double</code>可以表达更大的值,所有这些值都是整数。但是它们不具有单位精度,因此,当<code>long double</code>的值较大时,它的行为将偏离整数的预期行为。例如,如果longdouble变量d包含较大的值,则d1==dd-1==d中的至少一个可能求值为真。

 类似资料:
  • 这是对前段时间已经回答的问题的进一步澄清:可以存储在双精度中的最大整数 顶部答案提到“最大整数,以便它和所有较小的整数都可以存储在IEEE 64位双精度中而不会失去精度。IEEE 64位双精度有52位尾数,所以我认为它是2^53: 因为: > < li> 253 1无法存储,因为开头的1和结尾的1之间有太多的零。 任何小于 2 53 的东西都可以存储,其中52 位明确存储在尾数中,然后指数实际上给

  • 存储在双精度中的大于2^53的正整数的最大精度误差是多少?换句话说,对于从2^53 1到max(double)的所有正整数,实际整数和双精度值之间的最大精度差是多少。 我问这个问题的一点背景:我正在从pubsub读取SNMP计数器,并将它们写入BigQuery。计数器是UINT64,但BigQuery的整数数据类型是INT64。因此,我目前在BQ模式中使用浮点。对于我的用例来说,如果计数器关闭了数

  • 问题内容: 我试图确定双精度的最大精度是多少。在此链接的可接受答案的注释中,Java中的double保持精度 @PeterLawrey将max precision设置为15。 您如何确定呢? 问题答案: @PeterLawrey表示最大精度为15。 实际上,这根本不是他所说的。他说的是: 双精度有15个小数位 他错了。它们的精度为15个十进制 数字 。 任何数字中的小数位数由其对数10的对数给出。

  • 我试图确定double的最大精度是多少。在这个链接中接受的答案的注释中,Java中的Retain precision with double@PeterLawrey声明max precision In 15。 你如何确定这一点?

  • 问题内容: 我有一些现在大于INT可以处理的数字。 这有点令人尴尬,但老实说我不确切知道BIGINT(8)的含义。8是最大位值还是最大长度? 那么BIGINT(1)只能是一位数字吗?还是BIGINT(1)还有其他东西?我认为tinyint(1)最大值为127,如何计算出来? 我能做的最大的事情是什么?我可以在mysql中存储为整数的最大数字是多少? 问题答案: 数字代表它的显示方式-不会影响数据的

  • 我正在尝试创建一个程序,它将生成斐波那契序列中的数字,直到它找到序列中的1000位数字。我使用的代码运行良好并提供有效的输出,但是,我在检索每个数字的长度时遇到了麻烦;使用我已将转换为并使用方法获取长度,但是,我发现这并没有给出真正的长度,我看不出为什么。 有没有更好的方法来获取的长度?我已经读到了thBigInteger这个问题:在一个可伸缩的方法中计算小数位数 更新运行程序后输出的文本文本为: