【发布时间】:2020-01-15 20:41:05
【问题描述】:
我正在尝试比较从 nanf("1") 返回的两个浮点数,但程序没有进入 if 块。
int main(void)
{
volatile float f;
volatile float ff;
uint32_t* view1;
uint32_t* view2;
view1 = ((uint32_t*)&f);
view2 = ((uint32_t*)&ff);
f = nanf("1");
ff = nanf("1");
if(f == ff)
{
f = 0;
}
while(1);
}
调试器显示f 和ff(通过view1 和view2)变量具有安静的NaN 值(QNaN == 0x7FC00001)。
编译器:
gcc 版本 4.8.3 20131129 (release) [ARM/embedded-4_8-branch revision 205641](用于 ARM 嵌入式处理器的 GNU 工具)
编译器标志:
-mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -std=c99 -DSTM32F407VETx -DSTM32 -DSTM32F4 -DDEBUG -O0 -g3 -Wall -fmessage-length=0 -ffunction-sections -c
链接器标志:
-mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Wl,--gc-sections -lm
这是输出程序集(不能将其粘贴到代码块中):
if(f == ff)
080129b4: ldr r3, [pc, #32] ; (0x80129d8 <main+92>)
080129b6: vldr s14, [r3]
080129ba: ldr r3, [pc, #36] ; (0x80129e0 <main+100>)
080129bc: vldr s15, [r3]
080129c0: vcmp.f32 s14, s15
080129c4: vmrs APSR_nzcv, fpscr
080129c8: bne.n 0x80129d2 <main+86>
f = 0;
080129ca: ldr r3, [pc, #12] ; (0x80129d8 <main+92>)
080129cc: mov.w r2, #0
080129d0: str r2, [r3, #0]
while(1);
080129d2: b.n 0x80129d2 <main+86>
【问题讨论】:
标签: c gcc c99 cortex-m stm32f4