floating-point - 重写表达式以减轻数值抵消
问题描述
我最近回答了这个问题,其中要求 OP 找到一种更好的方法来评估以下表达式
表达式的x → 0的限制是 1/6,并且从n = 12 开始存在舍入误差,当n = 13时变得更加显着。
我挠了挠头,但无法找到更好的方法来评估先前的表达式。使用二项式近似值1 太好了,因为它对x的每个值都给出了 1/6 !!!任何人?
1: (9+ x )^0.5-3= 3*(1+ x /9)^0.5-3 ≈ 3*(1+ x /18)-3 = 3+ x /6-3 → (9+ x )^0.5-3/ x ≈ 1/6
解决方案
商的分子和分母乘以sqrt(9+x)+3
并化简。然后你的功能变成
f(x) = 1/(sqrt(9+x)+3)
它不会受到取消的影响,并且对小 x 给出了 1/6 的限制。
虽然这种变换是精确的,但如果您使用泰勒展开的下一个阶数,您可以获得稍微简单但有限的近似值
f(x) ~ 1/6 - 1/216 *x
x=1e-4 的相对误差为 0.1543203441e-10。
推荐阅读
- laravel - 如何在laravel中进行身份验证后重定向到页面之前登录用户详细信息
- php - 删除字符串中的 char '"' 并在 php 中创建数组
- php - 数据库死锁尝试在多个表中保存数据时
- java - 参数文件上的 AS400 SQL 脚本返回
- html - CSS - 如何将 div 内的内容水平居中
- excel - 如何在文本(链接)上将数字增加 1 并创建具有实际数字但每个副本 +1 的新文本
- java - 通过每两个字符分隔将二进制字符串更改为整数
- sparql - 在 sparql 中查询年龄
- knockout.js - Magento 2 - observables 在常见的 knockoutjs 和 magento 2 框架中的工作方式是否有区别?
- unity3d - UI Hololens - HandDraggable 问题