Floating point 浮点在内存中存储值有多棘手

Floating point 浮点在内存中存储值有多棘手,floating-point,ieee-754,Floating Point,Ieee 754,比如说,我必须在32位系统中将2147483648存储为浮点(而不是像整数一样的定点数字)。对于这个,尾数(有效位)和指数是多少?这个数字在内存中是如何表示的 浮点数通常由“有效位”的压缩组合表示,有效位是0或[1,2]范围内的二进制分数;指数;符号位。(参见上面关于“IEEE 754”的评论;这是最常见的浮点数表示法的标准。它完全可以用谷歌搜索。) 2147483648在某种程度上适合于典型的(单精度)浮点,因为最常见的形式使用二进制指数,这意味着数字表示为(有效位)*2指数。由于数字是二的幂

比如说,我必须在32位系统中将2147483648存储为浮点(而不是像整数一样的定点数字)。对于这个,尾数(有效位)和指数是多少?这个数字在内存中是如何表示的

浮点数通常由“有效位”的压缩组合表示,有效位是0或[1,2]范围内的二进制分数;指数;符号位。(参见上面关于“IEEE 754”的评论;这是最常见的浮点数表示法的标准。它完全可以用谷歌搜索。)

2147483648在某种程度上适合于典型的(单精度)
浮点
,因为最常见的形式使用二进制指数,这意味着数字表示为(有效位)*2指数。由于数字是二的幂,因此可以用1.0*231的单精度精确表示

但是,由于有效位(尾数)的大小实际上不是32位(它是24,IIRC),因此它不能存储任意大整数的所有有效位。这意味着2147483647和2147483649都不适合。它们的低位将被舍入,并且具有相同的表示(因此,具有相同的值)同2147483648


如果您关心两个如此大的值的非幂,请使用双精度。有效位足够大,可以安全地表示53位的整数。

要在IEEE-754中表示此数字(单精度);首先需要将其转换为二进制等效值。然后转换为形式

( (-1)^sign ) * (1 + fraction)*2^(exponent-bias)   
单精度偏差=127

 +----+-------------+------------------------------------+
 | 1  |      8      |                 23                 |
 |bit |     bit     |                bit                 |
 +-+--+------+------+-----------------+------------------+
   |         |                        |
   |         |                        |
   |         |                        |
   |         |                        |
   v         v                        v
 sign     Exponent                 Fraction
 bit 

=>+这个问题属于IEEE 754的浮点表示法。不是一个编程问题。事实上,我想知道浮点表示法与定点表示法(int)相比如何支持更大范围的数字。我已经阅读了这些wiki页面,但无法理解。尾数或有效位在32位计算机中只有24位长。数字(2147483647)如果它是一个定点表示,则它本身是31位的。我对浮点表示中支持更大的数字感到困惑。@Benjarobinac实际上我想知道浮点表示与它的定点表示(int)相比,如何支持更大范围的数字。我已经阅读了这些wiki页面,但无法理解。尾数或有效位在32位计算机中只有24位长。数字(2147483647)如果它是一个定点表示,则它本身是31位的。我对浮点表示中如何支持更大的数字感到困惑。@Luiggmendozai实际上我想知道浮点表示与定点表示(int)相比,如何支持更大范围的数字。我已经阅读了这些wiki页面,但无法理解。尾数或有效位在32位计算机中只有24位长。数字(2147483647)如果它是一个定点表示,则它本身是31位的。我很困惑,为什么在浮点中支持更大的数字。@CyrilleKa2147483648正好适合IEEE-754 32位二进制浮点对象,而不是“排序”。有效位是对数字值具有意义的位。2147483648由IEEE-754 32位二进制浮点对象精确表示的事实表明,它包含表示该值所需的所有位。在浮点表示中,尾随零不是有效位。2147483648完全适合,因为它是二的幂。值本身是可表示的,但几乎没有用处——例如,你不能加或减1,得到正确的结果。因此,“有点”适合。@cHao如果它是2147483647,那么表示形式会是什么,因为它是奇数?@ParveezAhmed:JS使用双精度(64位)所有数字的浮点,与C/Java/etc的
double
类型相同。因此它可以安全地保存32位整数(事实上,整数也要大一点…最多53位,或大约16位十进制数字)@rosemary:你的意思是3.4*10^38。但也许以10为基数的折衷会更有意义。比如说我有3个十进制数字,单是它们就只能构成000到999之间的整数。如果我使用科学记数法,并声明一个数字为指数,范围会急剧扩大;我可以表示9.9E+9(99亿)三位数
999
。问题是,现在我不能精确地表示999。(我指定了一个规则:一位数成为指数。如果我任意重复这一点,
999
变得毫无意义地模棱两可;它是指999还是99亿?)因此,我必须轮换,最多1000人,最多990人。最受欢迎的朋友@haccks患难的朋友才是真正的朋友