好的,我有一个简单的问题。在我的冒险中,我寻求可以容纳数据类型的最大数量,并且我尝试使用long int,double和float之类的方法。
但是在最简单的赋值中,例如Float x = 12345789,它给了我123456792作为输出。 这是代码
#include <stdio.h>
int main()
{
int x = 1234567891 ;
long int y = 9034567891234567899;
long long int z = 9034567891234567891;
float t = 123456789 ;
printf("%i \n%li \n%lli \n%f \n ",x,y,z,t);
}
输出的即时消息是
1234567891
9034567891234567899
9034567891234567891
123456792.000000
在Linux上使用gcc进行im编码。可能是什么问题?
为清楚起见,如果您提供更高的数字
float t = 123456789123456789
它将获得前9个正确的位,但在不应该保留的最后一个数中进行四舍五入。
1234567890519087104.000000
如果我的工作范围超过0(例如0.00123),İ可能会理解它,但它只是直接求整数,以找出浮点数的限制。
答案 0 :(得分:0)
Value: 123456789
Hexadecimal representation: 0x4ceb79a3
Binary representation: 01001100111010110111100110100011
sign (0) : +1
exponent(10011001) : 2^26
mantissa(11010110111100110100011): 1.8396495580673218
Value actually stored in float: 1.8396495580673218 * 2^26 = 123456792
Error due to conversion: 3
int main()
{
float t = 123456789;
}
main:
push rbp
mov rbp, rsp
movss xmm0, DWORD PTR .LC0[rip]
movss DWORD PTR [rbp-4], xmm0
mov eax, 0
pop rbp
ret
.LC0:
.long 1290500515 //(0x4CEB79A3)
答案 1 :(得分:0)
要查找可以从整数到浮点数再到整数的最大连续整数值,可以使用以下实验:
#include <stdio.h>
int main()
{
long i = 0 ;
float fint = 0 ;
while( i == (long)fint )
{
i++ ;
fint = (float)i ;
}
printf( "Largest integer representable exactly by float = %ld\n", i - 1 ) ;
return 0;
}
但是实验基本上是不必要的,因为该值可以预测为2 24 ,因为23是浮点数尾数的位数。