- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的代码求解二次方程(在游戏逻辑刻度中)来解决任务 - 找到空间中可移动物体轨道上的卫星刻度偏移量。而且我在判别式(更远的 D
)计算中遇到了错误。我会提醒:D = b^2 - 4ac
。因为是大天体的轨道,所以我的a
,b
& c
是这样的序号:
1E+8
1E+12
1E+16
据此,b^2
是关于1E+24
的阶数,&4ac
是关于1E+24
也是。但是这个方程根的数字要少得多,因为它们只是场景中的坐标。所以根大约是 1E+3 ... 1E+4
。
问题(已更新 - 具体化):因为 float 的值 float (和 double )b^2
& 4ac
有误差,足够小(相对于这些非常大的数字 [测量的绝对误差约为 1E+18
]),但作为 D
= = 它们之间的差异,所以当D
(从较大的值侧)到所提到的顺序值时,不准确性是(1E+18
) ,它的值开始在+1E+18 .. -1E+18
范围内波动(即波动范围大于实际值的[-100% .. +100%]!
显然,这种波动会导致错误的(甚至错误的定向)刻度偏移。我的卫星开始摇晃(这很糟糕))。
注意:当我说“当 D
接近于零时”实际上 D
离零还很远,所以我不能直接将它分配给 zerro in这个范围的值。
我考虑过使用定点计算(这可以使我摆脱问题)。但是,不建议在报价逻辑中使用(因为它们的优化程度要低得多,而且可能会非常慢)。
我的问题:我该如何尝试解决我的问题?可能有一些针对我的情况的通用解决方案?非常感谢任何建议!
PS:所有公式都很好(我在 excel 中计算了所有公式并得到了正确的结果,当我的代码中的 float 失败时)。
PPS:我尝试用 double 代替 float (不是所有计算,但我的 a
、b
和 c
现在是 double ) & 问题并没有消失。
更新:我犯了一个错误 - 混淆了 a
、b
和 c
的顺序。所以“b^2
是关于 1E+16
的订单数,& 4ac
是关于 1E+28
”错了。现在它固定为 1E+24
两者。 (我已经把这个写到已经写好的评论可以理解了)
更新#2:“问题”部分已具体化。
更新#3:值的真实案例(供引用):注意:此处的“准确值”我标记为在 Excel 中手动计算的值。
a == 1.43963872E+8
b == 3.24884062357827E+12
c == 1.83291898112689E+16
//floats:
b^2 == 1.05549641E+25
4ac == 1.05549641E+25
D == 0.0
root:
y = -1.12835273E+4
//doubles:
b^2 == 1.0554965397412443E+25
4ac == 1.0554964543412880E+25
D == 8.5399956328598733E+17
roots:
y1 == -1.1280317962726038E+4
y2 == -1.1286737079932651E+4
//accurate values:
b^2 == 1.05549653974124E+25
4ac == 1.05549645434129E+25
D == 8.53999563285987E+17
roots:
y1 == -1.128031796E+4
y2 == -1.128673708E+4
double 看起来不错,但事实并非如此,因为这里我只给出了部分计算 - 这里我从相同的 a、b 和 c 值开始,但它们在我的代码中的实际值也被计算了。并包含不准确性,即使是 double 也会产生问题。
最佳答案
使用标准二次公式会产生“灾难性的抵消”,其中减去 2 个相同数量级的数字会导致精度损失。
诀窍是在这种情况下使用替代公式,请参见此处: https://math.stackexchange.com/a/311397
更新:我误解了你的问题。我认为问题更可能是您的结果对输入数字的敏感性。让我们选择,说
a = 4e8
b = -1e12
c = 6.2e14
解决方案是 ~1138 和 1361。现在,如果你计算相对导数。我可以在 Julia 中通过使用 ForwardDiff.jl 的自动微分来做到这一点包裹:
julia> import ForwardDiff.Dual
julia> function p(a,b,c)
D = sqrt(b^2-4*a*c)
(-b+D)/(2a), (-b-D)/(2a)
end
julia> p(a,Dual(b,b),c)
(Dual(1361.803398874989,15225.424859373757),Dual(1138.196601125011,-12725.424859373757))
julia> p(Dual(a,a),b,c)
(Dual(1361.803398874989,-8293.614129124373),Dual(1138.196601125011,5793.614129124373))
julia> p(a,b,Dual(c,c))
(Dual(1361.803398874989,-6931.8107302493845),Dual(1138.196601125011,6931.8107302493845))
此处的结果是两个解及其缩放导数(即 (df/dx)*x)。请注意,它们都是 O(10000) 阶的,因此如果输入有 0.000001% 的错误,输出将有 0.1% 的错误。
此处唯一的解决方案是重新表述您的问题,使其对输入值不那么敏感。
关于c++ - float 不准确导致计算错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41087901/
当然,您可以将剩余文件大小除以当前下载速度,但如果您的下载速度波动(而且它会波动),这不会产生很好的结果。有什么更好的算法可以产生更平滑的倒计时? 最佳答案 安exponential moving a
对于一个业余项目,我正在尝试对齐照片并创建 3D 图片。我基本上在一个钻机上有 2 个相机,我用来拍照。我会自动尝试以您获得 3D SBS 图像的方式对齐图像。 它们是高分辨率图像,这意味着需要处理大
当然,您可以将剩余的文件大小除以当前的下载速度,但如果您的下载速度波动(而且会波动),这不会产生很好的结果。什么是产生更平滑倒计时的更好算法? 最佳答案 安exponential moving ave
我有一个数据集,其中包含患有糖尿病和未患有糖尿病的人。我想使用这些数据训练一个模型来计算糖尿病状况未知的人的风险概率。我知道在培训中没有被诊断出糖尿病的人大多数都没有糖尿病,但很可能其中一些人可能患有
let parent = path[row-1] let child = path[row] let indexOfChild = matrix[parent.obje
我正在编写一些使用 Element.getBoundingClientRect 的代码(gBCR),加上内联样式更新,以执行计算。 这不适用于一般网站,我不关心或不感兴趣是否有“更好的 CSS 方式”
我有一个很大的 csv 文件,其中包含大量脏数据,我想通过消除所有不是绝对必要的值来稍微清理一下它。 Here是我正在谈论的文件。 它有以下组件: 网站,标题,开始日期,开始日期,雇主,地点,纬度,
有谁知道一个库,它为 Java 提供了一个错误不高于 1-2 毫秒的 Thread.sleep()? 我尝试了 sleep 、错误测量和 BusyWait 的混合,但在不同的 Windows 机器上我
UiApp有DateBox和 DateTimeFormat 对于那个类(class)。但是,不存在诸如 TimePicker 或 TimeBox 这样的东西,用户可以通过明确指定的方式(例如通过使用
因此,我使用 sklearn 的 svm.SVC 模块编写了一个程序来学习 mnist 数据集,出于某种原因,每当我计算其准确性为 100% 时。这似乎好得令人难以置信,这是预期的吗? from sk
我当前找到了 gpytorch ( https://github.com/cornellius-gp/gpytorch )。它似乎是将 GPR 集成到 pytorch 中的一个很棒的包。第一次测试也呈
我正在使用 QT Creator 5.9 创建一个简单的 Web 浏览器模型,我的 EditLine/Text Box 有问题: 1.如何在转到不同的网站/页面后自动更新显示的 URL 字符串。 2。
我在 Linux 上尝试 time -p 命令,我写了一些代码来浪费 CPU 周期: #include using namespace std; int main() { long int c;
亲爱的程序员/脚本编写者/工程师/其他人, 问题:我目前正在为 Android 3.2 平板电脑开发增强现实应用程序,但在获取准确的罗盘读数方面遇到一些问题。我需要确切地知道平板电脑所面向的 (z)
我最近一直在尝试了解 Apache Spark 作为 Scikit Learn 的替代品,但在我看来,即使在简单的情况下,Scikit 收敛到准确模型的速度也远远快于 Spark。例如,我使用以下脚本
如果不是,它的准确性如何? 我想在下载之前知道图片的大小。 最佳答案 HTTP Content-length header 是否格式错误?是的。 您是否应该相信它能公平地表示消息正文的大小?是的。 关
这是一个关于 ngram 线性回归的问题,使用 Tf-IDF(术语频率 - 逆文档频率)。为此,我使用 numpy 稀疏矩阵和 sklearn 进行线性回归。 使用一元语法时,我有 53 个案例和 6
对于某些给定的固定宽度,如何计算特定标签 (NSTextField) 中字符串的高度? 我用谷歌搜索了各种方法并尝试了 this method from Apple .它的工作原理,除了高度变成一行对
我是一名优秀的程序员,十分优秀!