gpt4 book ai didi

c - 浮点精度与实际分配的值不匹配?

转载 作者:太空宇宙 更新时间:2023-11-04 05:16:19 26 4
gpt4 key购买 nike

我正在使用 STM32F777 mcu 在 FreeRTOS 上创建应用程序。 STM32F777自带 double 浮点单元。我在使用浮点单位时发现了这个非常烦人的问题,当我使用常量或其他东西为 float 赋值时,例如:

float x = 78.352361;

调试时我看到分配给变量 x 的实际值是:78.3523636

同样,当我将17.448636赋值给变量x时,调试时实际看到赋值的是17.4486351

任何想法,为什么会发生这种情况以及如何解决这个问题?我希望将正确的精度保持到 6 位数。

最佳答案

最常见的浮点格式 IEEE 754 包括基本的 32 位格式和基本的 64 位格式,这些通常用于 floatdouble C 中的类型。为简洁起见,我将在这个答案中称它们为 floatdouble

除了 2 的幂的倍数(例如 ¼、¾、1/1024、73/1048576)之外,这些类型都不能准确表示非整数。从十进制转换为 floatdouble 时,每隔一个数字都会略有变化。

但是,float 具有将任何具有六位有效数字(例如 1.2345 或 9.87654e23)的十进制数字四舍五入为 float 并返回六位有效十进制数字的属性返回原始数字(前提是数字在格式的正常范围内)。在 C 语言中,此位数由值 FLT_DIG 报告,该值由 float.h 定义。由于您的号码 78.352361 有八位有效数字,因此不能保证它在转换为 float 并返回时仍然存在。

对于 double,至少有 15 位数字将在往返过程中保留下来,由 DBL_DIG 报告。

请注意,这是保证在一次转换为二进制 float 并返回到原始小数位数的舍入后保留下来的小数位数。如果在 float 中执行额外的运算,则会发生额外的舍入,这可能会累积更多的错误。而且,如果一个值的格式设置有比原始数字更多的小数位,则结果可能与原始数字不同。 (例如,.9f 在转换回一位十进制数字时生成“.9”,但在转换回九位十进制数字时生成“0.899999976”。)

由于 double 保证 15 位数字在往返过程中保留下来,因此您的号码 78.352361 在转换为 double 并返回到八位有效数字不变后仍会保留下来。此外,有足够的精度来执行一些算术,而不会累积太多错误,以至于它在八位有效的十进制数字中是可见的。但是,浮点运算可能很棘手,完整的错误分析取决于您执行的操作。

关于c - 浮点精度与实际分配的值不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48904533/

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