【问题标题】:Printing floating-point numbers (hexadecimal) in IEEE standard in C在 C 中以 IEEE 标准打印浮点数(十六进制)
【发布时间】:2021-07-07 09:55:32
【问题描述】:

我想以 IEEE 标准表示(符号、8 位指数、23 位尾数)打印两个浮点数的十六进制值。我的问题是,我的随机生成的数字是超级大(例如:-26815622280406798000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000)。点后,没有任何数字(只有0),并用符号 P>

#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;
}

【问题讨论】:

  • 您的意思是“将浮点值的原始形式转储为十六进制”还是“转储十六进制等效值”?
  • 注意,这里使用的缩进风格真的很乱,很难跟上。
  • 是的,我想像这样打印浮点的原始形式:upload.wikimedia.org/wikipedia/commons/thumb/e/e8/…
  • 您可以使用%a%A printf 格式说明符以十六进制打印浮点值。
  • 一个用于将类型的二进制表示重新解释为不同类型的常用技巧(称为“类型双关语”)是使用联合。例如union foo { float f; unsigned int ui; };union foo x;x.f = Vectors_A;`printf("%x", x.ui);.

标签: c floating-point 32-bit ieee-754


【解决方案1】:

在没有流量控制的情况下,C 是自上而下运行的。因此,当您使用两个未初始化的变量初始化 RandomVector 时,您会得到未定义的行为。您稍后将两个值分配给Vector1 和Vector2 并不重要。

【讨论】:

  • 换句话说,“在使用它们之前初始化你的值”。
  • 我更正了,但我总是得到相同的结果
  • @Gabbed:你可能应该学会在你的系统上使用调试器。
  • “我总是得到相同的结果”。那么,另一个问题?
【解决方案2】:

您的RandomVector 是随机的,因为它基于未初始化的值,这是未定义的行为。之后你只为Vector1Vector2 赋值,但你从不使用它们。你应该这样尝试:

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;
}

【讨论】:

  • 仍然得到这些超级大的数字。这是输出的一个示例:Vettore 3_A:40000000 => 2.000000 Vettore 3_B:60000000 => 26815622242753719000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000索马TRA i由于韦托:0 => 0.000000(SUM)跨度>
  • @Gabbed。使用调试器。当我只用我的那个函数运行你的代码时,我得到如下结果: Vettore 20_A: 20000000 => 0.075988 Vettore 20_B: 60000000 => 0.154560 Somma tra i due vettori: fbadd2a0 => 0.230548
  • 出现被零除错误的几率为 30 分之一。
  • @IanAbbott 不,它们是花车。它们不会导致被零除的错误。不过,有机会获得inf 的结果。
  • @Gabbed '%x' 格式说明符需要 unsigned int 作为参数,但您传递的是 float。如果这些类型的大小不同,printf 可能会损坏您的堆栈,这可能会产生一些奇怪的副作用,例如打印垃圾数据。
猜你喜欢
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
  • 2011-07-07
  • 2018-10-07
  • 2011-02-25
相关资源
最近更新 更多