gpt4 book ai didi

c - -C 中 printf 中的 NaN

转载 作者:行者123 更新时间:2023-12-04 02:22:04 29 4
gpt4 key购买 nike

我目前在某些计算中遇到 Raytracer“引擎”的问题。

  info->eyex = -1000.0;
info->eyey = 0.0;
printf("%f et %f et %f et %f et %f\n", info->eyex, info->vx, info->eyey, info->vy, info->vz);

例如,在那段代码中,值看起来不错,但是 info->eyex 给我一个 -nan 错误。

这很奇怪,因为我之前重置了这个值。

最佳答案

我的心理感觉告诉我 eyex 被声明为 int,而不是应有的 double。当您将 -1000.0 分配给它时,它会被截断为整数 -1000(您的编译器应该在这里给您一个警告),它使用二进制补码表示为二进制 0xFFFFFC18。同样,假设 eye 也是一个整数,它的值 0 在二进制中表示为 0x00000000。

当您将 eyexeyey 和其他参数传递给 printf 时,它们会被压入堆栈以便位于内存中随着地址的增加。所以在 call 指令调用子例程之前,堆栈帧看起来像这样:

<top of stack>
0xFFFFFC18 ; eyex
(4-8 bytes) ; vx
0x00000000 ; eyey
(4-8 bytes) ; vy
(4-8 bytes) ; vz

printf 看到 %f 格式说明符时,表示“从堆栈中取出 8 个字节,将它们解释为 double 值,并打印出那个 double 值”。所以它看到值 0xFFFFFC18xxxxxxxx,其中 xxxxxxxxx 是 info->vx 的值。无论该值如何,这都是 IEEE 754 NaN 的表示,或“不是数字”。它设置了符号位,因此某些实现可能会选择将其解释为“负 NaN”,尽管这与常规 NaN 具有相同的语义。

您的编译器还应该在这里警告您,您将错误类型的参数传递给 printf — 它期待一个 double 但您没有传递它. GCC 使用 -Wall 启用这些警告,我强烈建议启用它。

因此,解决方案是将 eyex 声明为 double 类型(假设其他变量也为 double,如果它们还没有)。或者,如果您不控制 eyex 等的定义(例如,因为它们是第三方库结构的一部分),那么您应该做的是打印它们out 使用 %d 修饰符将它们打印为整数,而不是使用 %f,并且您还应该为它们分配整数值,例如 -1000 和 0,而不是 float 值,例如 -1000.0 和 0.0。

关于c - -C 中 printf 中的 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5282974/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com