用C语言打印IEEE标准中的浮点数(十六进制)
我想打印IEEE标准表示法中两个浮点数的十六进制值(符号、8位指数、23位尾数)。我的问题是,我随机生成的数字是超大的(例如:-26815622280406798000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000用C语言打印IEEE标准中的浮点数(十六进制),c,floating-point,32-bit,ieee-754,C,Floating Point,32 Bit,Ieee 754,我想打印IEEE标准表示法中两个浮点数的十六进制值(符号、8位指数、23位尾数)。我的问题是,我随机生成的数字是超大的(例如:-268156222804067980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
float RandVectorGen(void);
int main () {
srand(time(NULL));
float Vectors_A = 0, Vectors_B = 0, Vectors_SUM = 0;
for(int i = 0; i <= 20; ++i) {
Vectors_A = RandVectorGen(); //Genera 20 vettori tra 100 e 0
Vectors_B = RandVectorGen();
printf("Vettore %d_A: %x => %.6f\n", i, Vectors_A, Vectors_A);
printf("Vettore %d_B: %x => %.6f\n", i, Vectors_B, Vectors_B);
Vectors_SUM = Vectors_A + Vectors_B;
printf("Somma tra i due vettori: %x => %.6f\n", Vectors_SUM, Vectors_SUM);
puts(" ");
}
return 0;
}
float RandVectorGen (void) {
unsigned int Vector1, Vector2;
float RandomVector = ((float)Vector1 / (float)Vector2) * fabs(sin(rand() % 10));
Vector1 = (rand() % 30);
Vector2 = (rand() % 30);
return RandomVector;
}
#包括
#包括
#包括
#包括
浮动矢量发生器(无效);
int main(){
srand(时间(空));
浮点向量_A=0,向量_B=0,向量_和=0;
对于(int i=0;i在没有流控制的情况下,C从上到下运行。因此,当您使用两个未初始化的变量初始化RandomVector
时,您会得到未定义的行为。稍后为Vector
1和Vector2
分配两个值并不重要。在没有流控制的情况下,C从上到下运行ttom.因此,当您使用两个未初始化的变量初始化RandomVector
时,您会得到未定义的行为。以后是否为Vector
1和Vector2
分配两个值并不重要,因为RandomVector
是基于未初始化值的随机行为。在此之后,您只能将值分配给Vector1
和Vector2
,但您永远不会使用这些值。您应该这样尝试:
float RandVectorGen (void)
{
unsigned int Vector1, Vector2;
float RandomVector;
Vector1 = (rand() % 30);
Vector2 = (rand() % 30);
RandomVector = ((float)Vector1 / (float)Vector2) * fabs(sin(rand() % 10));
return RandomVector;
}
您的RandomVector
是随机的,因为它基于未初始化的值,这是未定义的行为。在此之后,您只能将值分配给Vector1
和Vector2
,但决不使用这些值。您应该这样尝试:
float RandVectorGen (void)
{
unsigned int Vector1, Vector2;
float RandomVector;
Vector1 = (rand() % 30);
Vector2 = (rand() % 30);
RandomVector = ((float)Vector1 / (float)Vector2) * fabs(sin(rand() % 10));
return RandomVector;
}
您的意思是“将浮点值的原始形式转储为十六进制”还是“转储十六进制等效值”?注意,这里使用的缩进样式非常混乱,很难理解。是的,我想这样打印浮点的原始形式:您可以使用%a
或%a
printf格式说明符以十六进制打印浮点值。一个常用的技巧用于将类型的二进制表示形式重新解释为不同的nt类型(称为“类型双关”)是使用一个并集。例如union foo{float f;unsigned int ui;};
union foo x;
x.f=Vectors\u a;`printf(“%x”,x.ui);
。您的意思是“将浮点值的原始形式转储为十六进制”还是“转储十六进制等价值”?注意,这里使用的缩进样式非常混乱,很难理解。是的,我想这样打印浮点的原始形式:您可以使用%a
或%a
printf格式说明符以十六进制打印浮点值。一个常用的技巧用于将类型的二进制表示形式重新解释为不同的nt类型(称为“类型双关”)是使用一个并集。例如union foo{float f;unsigned intui;};
union foo x;
x.f=Vectors\u a;`printf(“%x”,x.ui);
。换句话说,“在使用值之前先初始化值”.我改正了,但我总是得到相同的答案results@Gabbed:您可能应该学会在系统上使用调试器。“我总是得到相同的结果”。那么,一个不同的问题?换句话说,“在使用之前初始化您的值”。我更正了,但我总是得到相同的结果results@Gabbed:您可能应该学会在系统上使用调试器。“我总是得到同样的结果"这是一个输出的例子:Vettore 3_a:40000000=>2.000000 Vettore 3_B:60000000=>268156222475371900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000=>0.000000(总和)@Gabbed.使用调试器。当我用我的函数替换你的代码时,我得到如下结果:Vettore 20_a:20000000=>0.075988 Vettore 20_B:60000000=>0.154560 Somma tra I due vettori:fbadd2a0=>0.230548有1/30的机会得到一个被零除的错误。@Ianabott不,它们是浮点数。它们不会导致divi逐零反求错误。虽然有可能得到inf
作为结果。@Gabbed“%x”格式说明符要求将无符号int
作为参数,但您传递的是浮点值
。如果这些类型的大小不同,printf
可能会损坏堆栈,这可能会产生一些奇怪的副作用,例如打印这是一个输出的例子:Vettore 3_A:40000000=>2.000000 Vettore 3_B:60000000=>268156222427537190000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000(总和)@Gabbed.使用调试器。当我用我的函数替换你的代码时,我得到如下结果:Vettore 20_a:20000000=>0.075988 Vettore 20_B:60000000=>0.154560 Somma tra I due vettori:fbadd2a0=>0.230548有1/30的机会得到一个被零除的错误。@Ianabott不,它们是浮点数。它们不会导致divi逐零反求错误。虽然有可能得到inf
作为结果。@Gabbed“%x”格式说明符要求将无符号int
作为参数,但您传递的是浮点值
。如果这些类型的大小不同,printf
可能会损坏堆栈,这可能会产生一些奇怪的副作用,例如打印垃圾数据的处理。