- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在为医疗设备开发固件,其中涉及很多困难的数学运算。目标处理器支持硬件中的浮点运算,但仅支持 float32
(又名 single
)。
为了模拟行为并证明我的公式和代码的正确性,我将固件的相关/数学部分移植到 Linux 中的 GCC 工具链(gcc 6.3.0,libc6 2.24),仔细检查 float32
无处不在,没有使用编译器开关,这可能会降低数学运算的精度或标准兼容性;值得注意的是,没有 -ffast-math
或其 friend 。
现在,事实证明,对于一小组输入参数,我得到了意想不到的结果。我已经追踪到问题并得出结论,libm
为 arctan
(准确地说:atan2
)计算了一个错误的结果非常小的一组输入参数。
例如,如果我有
#include <math.h>
#define C_RAD2DEG (57.29577951308f)
int main(void)
{
float f_Temp = C_RAD2DEG * atan2f(0.713114202f, 0.665558934f);
}
f_Temp
计算为 46.9755516f
,其中正确的结果为 46.975548972f
。
请注意,我通常了解不同 float 据类型、舍入错误等问题。
但是,我的感觉是,即使 float32
的精度较低,上面显示的误差也高了一个数量级,不幸的是,对于随后的计算,该误差太大了.
此外,atan2
函数的可能输入参数中只有很小一部分会受到该问题的影响。
谁能简短地解释一下这是 libm
中的错误,还是仅仅是由于 float32
的不精确以及计算所需的大量顺序操作atan2
?
最佳答案
您作为观察结果报告的数字 46.9755516f
对应于 float
值 46.975551605224609375。
您作为预期结果报告的数字 46.975548972f
对应于 float
值 46.97554779052734375。
这些是相邻的 float
值,这意味着它们相差 1 个最小精度单位 (ULP)。 (它们的区别是 3.814697265625e-06,这是当最高有效位的值为 32 时 float
significand 中最低有效位的值,就像 47 左右的数字一样。)这是float
可以在该比例下更改的最小可能量。
通常,数学库例程很难实现,并且没有人用正确的舍入(舍入到最接近精确数学值的可表示数字)和已知的有界运行时间来实现所有这些例程。一些 ULP 误差在三角函数例程中并不罕见。
即使您使用的 libc 代码提供了正确舍入的结果,将其从弧度转换为度数也会引入两个更多的舍入错误(将 180/π 转换为可表示的值并乘以它)。期望最终结果是最接近理想数学结果的 float
是不合理的;你应该预料到几个 ULP 错误。
关于c - 使用 glibc/libm 和 float32 的 atan2 的错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54745708/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!