用C语言打印IEEE标准中的浮点数(十六进制)

用C语言打印IEEE标准中的浮点数(十六进制),c,floating-point,32-bit,ieee-754,C,Floating Point,32 Bit,Ieee 754,我想打印IEEE标准表示法中两个浮点数的十六进制值(符号、8位指数、23位尾数)。我的问题是,我随机生成的数字是超大的(例如:-268156222804067980000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

我想打印IEEE标准表示法中两个浮点数的十六进制值(符号、8位指数、23位尾数)。我的问题是,我随机生成的数字是超大的(例如:-26815622280406798000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

#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
可能会损坏堆栈,这可能会产生一些奇怪的副作用,例如打印垃圾数据的处理。