R&;函数的C版本给出不同的结果-舍入还是运算符错误?

R&;函数的C版本给出不同的结果-舍入还是运算符错误?,c,r,rounding-error,C,R,Rounding Error,我用C重写了一段R代码,这两个版本提供了不同的结果。我认为这是由于R级别的舍入问题,即正在执行多个数学运算,这会产生复杂的舍入问题,而不是在C中完成整件事情,舍入只发生一次。我担心我在这里过于乐观了,希望能有更多的人来看看我是否遗漏了什么,实际上这只是我这方面的糟糕编码 首先是R代码: h_tx <- function(x, sigma_nu, sigma_eta, alpha=0) { b <- (sqrt(exp(sigma_eta^2) - 1)) / sigma_nu

我用C重写了一段R代码,这两个版本提供了不同的结果。我认为这是由于R级别的舍入问题,即正在执行多个数学运算,这会产生复杂的舍入问题,而不是在C中完成整件事情,舍入只发生一次。我担心我在这里过于乐观了,希望能有更多的人来看看我是否遗漏了什么,实际上这只是我这方面的糟糕编码

首先是R代码:

h_tx <- function(x, sigma_nu, sigma_eta, alpha=0) {
   b <- (sqrt(exp(sigma_eta^2) - 1)) / sigma_nu
   a <- -alpha * b
   asinh(a+b*x)
}
例如,传入值5、5、5、0时,R为13.19,C为12.69。从技术上讲,R代码是矢量化的,但C代码的这个特定块不是,因此我不想提供矢量化输入作为示例


这些功能是相同的,还是我做了不正确的事情?

您的表达方式不同:

b <- (sqrt(exp(sigma_eta^2) - 1)) / sigma_nu 1 2 3-----------3 21 \ \------------------// \----------------------/
-1
在括号的第3组中:
exp

请您提供一些导致结果分歧的输入和相应的输出。有多大不同?我的意思是3.1415对3.1416或2.7172对1.4142?sqrt(exp(pow(sigmaEta,2))-1),一个错误放置的parenAlso,您正在使用的C编译器、版本和标志。所有这些都会影响结果。我知道我会后悔发了这个。谢谢马丁:)好的,就这样。结果大致相当接近,四舍五入似乎是可能的,但我不相信这种观点。操作员错误。@geoffjentry FWIW 13.19对12.69相距很远。你不应该怀疑我在这里。人们总是很容易怀疑别人而不是你自己,但是大多数bug都是由人工操作引起的!! b <- (sqrt(exp(sigma_eta^2) - 1)) / sigma_nu 1 2 3-----------3 21 \ \------------------// \----------------------/ b = (sqrt(exp(pow(sigmaEta,2)-1))) / sigmaNu; 1 2 3 4----------4 321 \ \ \---------------/// \ \------------------// \----------------------/