【发布时间】:2021-12-13 09:33:00
【问题描述】:
[我试图计算一个浮点乘法,我观察到该值已经饱和到 65536 并且没有更新。
问题仅在于以下代码。]1
我用在线 GCC 编译器试过了,问题还是一样。
这与浮点精度有什么关系吗?编译器是否在运行期间优化我的浮点精度?
我可以添加任何编译器标志来解决这个问题吗?
谁能指导我如何解决这个问题?
附上代码供参考
#include <stdio.h>
int main()
{
float dummy1, dummy2;
unsigned int i =0;
printf("Hello World");
printf("size of float = %ld\n", sizeof(dummy1));
dummy2 = 0.0;
dummy1 =65535.5;
dummy2 = 60.00 * 0.00005;
for( i= 0; i< 300; i++)
{
dummy1 = dummy1 + dummy2;
printf("dummy1 = %f %f\n", dummy1, dummy2);
}
return 0;
};
【问题讨论】:
-
sizeof的结果是size_t类型的值,需要用%zu打印。虽然它不应该影响程序的行为,但从技术上讲,它确实具有未定义的行为,因为您在打印大小时使用了不匹配的格式说明符和参数。 -
另外,您展示了三个不同的程序。两个作为图像(请不要发布文本图像,尤其是所有代码)。这三个程序中的哪一个是你的minimal reproducible example?也请花一些时间阅读the help pages,阅读SO tour,阅读How to Ask,以及this question checklist。
-
不要将源代码或程序输出显示为图像。你的程序输出文本,很容易复制粘贴到问题中。
标签: gcc floating-point precision multiplication saturation-arithmetic