问题标签 [elementary-functions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
floating-point - 为什么当另一个公式似乎更有意义时,基于表格的 sin 近似文献总是使用这个公式?
用表格计算初等函数的文献sin
参考了以下公式:
其中x = Cn + h
,Cn
是一个常数,它sin(Cn)
和cos(Cn)
已经预先计算并且在表格中可用,并且,如果遵循 Gal 的方法,Cn
已经选择使得两者sin(Cn)
和cos(Cn)
都由浮点数非常近似。数量h
接近0.0
。参考此公式的一个示例是这篇文章(第 7 页)。
我不明白为什么这是有道理的:cos(h)
不管如何计算,对于 的某些值,它可能至少会出错 0.5 ULP h
,并且由于它接近1.0
,这似乎对结果的准确性产生了巨大影响sin(x)
当以这种方式计算时。
我不明白为什么不使用下面的公式:
然后这两个量(cos(h) - 1.0)
和sin(h)
可以用多项式来近似,这些多项式很容易准确,因为它们产生接近零的结果。和的值仍然很小sin(Cn) * (cos(h) - 1.0)
, cos(Cn) * sin(h)
其绝对精度用和所代表的小数量的 ULP 表示,因此添加这个数量sin(Cn)
几乎是正确的四舍五入。
我是否遗漏了一些使早期、流行、更简单的公式也表现良好的东西?作者是否理所当然地认为读者会理解第一个公式实际上是作为第二个公式实现的?
编辑:示例
用于计算单精度的单精度表sinf()
,cosf()
可能包含以下单精度点:
以下函数是用于 around 的专用单精度函数0.017967
:
在 0.01f 和 0.025f 之间测试这些函数似乎表明新公式给出了更精确的结果:
我采取了几个捷径,所以请查看完整的程序。
floating-point - 如何以度为单位计算正确舍入的三角函数?
我如何定义以度数而不是通常的弧度为参数的三角函数,并为这些参数计算正确的舍入结果?
在将参数传递给以弧度表示的相应函数之前将参数乘以是M_PI/180.0
行不通的,因为M_PI/180.0
不是 π/180。Handbook of Floating-Point Arithmetic 的第 5.5 节提供了一种计算参数正确舍入乘积 π/180 的方法,但有些参数仍然会使得该乘积接近两个连续可表示浮点数之间的中点,然后即使在弧度中应用正确舍入的函数也会产生错误的最终结果。
可以单独或组合使用的两种策略是使用更高的精度和使用来自CRlibm的三角函数sinpi
,它们分别计算和和。cospi
tanpi
sin(πx)
cos(πx)
tan(πx)
对于后一种策略,仍然存在除以 180 的问题,这对于许多论点来说并不准确。
关于更高精度的策略(将参数乘以 π/180 的扩展精度表示,然后以弧度应用扩展精度函数),“精确”情况可能仍然存在问题。指出 的唯一理性结果 和 的唯一理性结果的定理sin
仅cos
适用tan
于0
弧度版本。它显然不适用于度数版本,如果对于某些浮点输入 x,sindeg(x) 恰好是两个连续可表示浮点数之间的中点,那么再多的中间精度都不足以保证最终结果正确四舍五入。
matlab - 不能完全理解计算指数函数的 CORDIC 算法
我读过一两篇关于 CORDIC 的论文,但不太明白。但是我从互联网上下载了一个使用这个算法计算指数函数的代码。它非常有用,可以帮助我在 FPGA 上实现函数的指数项。但现在我正在尝试写一份报告,我无法解释 CORDIC 部分是如何工作的,我无法与一般的 CORDIC 算法相关联。请帮助我,并提前谢谢你。
我做了一些修改并删除了一些代码并试图使其更简单并且它有效,我不知道我做了什么以及为什么它仍然有效!!!!
java - 如何定义算法中的基本操作是什么?
我一直认为算法的基本操作是位于最内层循环内的操作。我在书籍和在线文章中发现的细节很少,可能是因为它应该是微不足道的,但少数愿意解释算法中的基本操作应该是什么,他们总是说它是执行的操作most,即位于最内循环内的那个。
因此,在这个算法中:
我说基本操作是houses[i] = in.nextInt();
第一个for里面的赋值操作,因为它运行了N次,而第二个for运行了N-1次。
我的老师说这是不正确的,这个算法中的基本操作是秒内的操作。
无论如何,有一些例外情况,即基本操作不是位于最内循环内的操作,或者她错了?
precision - IEEE-754 double precision and splitting method
When you compute elementary functions, you apply constant modification. Specially in the implementation of exp(x). In all these implementations any correction with ln(2) is done in two steps. ln(2) is split in two numbers:
Then any computation with ln(2) is done by:
I know it is to avoid rounding effect. But why this two numbers in specially ? Some of you have an idea how get these two numbers ?
Thank you !
Following the first comment I complete this post with more material and a very weird question. I worked with my team and we agree the deal is to double potentially the precision by splitting the number ln(2) in two numbers. For this, two transformations are applied, the first one:
the k indicates the precisions, in look likes in Cephes library (~1980) for float k has been fixed on 9, 16 for double and also 16 for long long double (why I do not know). So for double c_h has a precision of 16 bits but 52 bits for c_l.
From this, I write the following program, and determine c_h with 52 bit precision.
}
If I compute now for a set of different values I get:
It like when x becomes larger than 300 a difference appear. I had a look on the the implementation of gnulibc
http://osxr.org:8080/glibc/source/sysdeps/ieee754/ldbl-128/s_expm1l.c
presently it is using the 16 bits prevision for c_h (line 84)
Well I am probably missing something, with the IEEE standard, and I can not imagine an error of precision in glibc. What do you think ?
Best,
clojure - clojure:通过键存在和值过滤映射向量
我有一个像这样的地图矢量
我正在尝试定义一个函数,该函数接受类似的地图{"element1" 1 "element3" 6}
(即:带有n个字段,或)并将{}
地图调整为与提供的地图中的那个键相关联(如果提供的地图没有任何类似的键,则不会返回)map1
requires
consumes
但我无法掌握如何处理地图递归循环和过滤
java - Java编程问题
谁能帮我解决这个问题。我不明白我可以把地区的号码放在哪里。还有这个表达式到底是什么意思:
这是程序:
编写一个 Java 程序,读取一个表示正方形边的整数值并打印出正方形的面积和周长。为所有输出使用正确的标签并正确注释您的代码。
r - 为什么忽略 head 整数参数?
我将格式不正确的 CSV 文件导入为大型列表元素,然后 rbind 进入 dataframe。尝试在 RStudio 1.0.143(Windows 10 Pro)中检查这个大列表的元素,以下命令都会导致 200 行输出到控制台:
在此输出的末尾将是如下语句:
为什么整数参数被忽略?我已经加载了tidyr
包裹有关系吗?
python-3.x - 如何遍历基本算术符号
我想检查在它们之间放置基本算术符号时7位数字是否可以达到100。
如何用列表中的算术符号替换变量?