C函数导致舍入数

时间:2012-10-05 21:40:38

标签: r

案例

我已经为dyn.loading编译了共享库到R.然后当我在R中调用包装器函数时,得到的结果用小数点后的截断部分舍入。我可能遗漏了一些众所周知的东西,因为它是我第一次尝试使用.C函数,但我找不到舍入的原因是什么。我的代码如下。

我的C代码

#include <freesteam/steam_pT.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <R.h>

// gcc -Wall -fPIC -c Rsteam_h_pT_2.c -o  Rsteam_h_pT_2.o -I/usr/local/include -I/opt/R-2.14.0/lib/R/include -L/usr/local/lib -lfreesteam
// gcc -Wall -shared -o Rsteam_h_pT_2.so Rsteam_h_pT_2.o -I/usr/local/include -I/opt/R-2.14.0/lib/R/include -L/usr/local/lib -lfreesteam

// function
double steam_h_pT(double p, double T){
SteamState S = freesteam_set_pT(p, T);
double s = freesteam_h(S);
return s;
}


// wrapper
double steam_h_pT(double, double);
void steam_h_pT_R_wrapper(double *p, double *T, double *result) { *result = steam_h_pT(*p, *T); }

我的R功能

steam_h_pT <- function(p_Pa,T_K)
 {
 dyn.load('Rsteam_h_pT.so')
 # Call the C function
 returned_data = .C('steam_h_pT_R_wrapper', p=as.numeric(p_Pa), T= as.numeric(T_K), result=numeric(1))
 # Return the value of the result parameter
 return(returned_data$result)
 }

我的R会话

> steam_h_pT(100000,400)
[1] 2730398
> str(steam_h_pT(100000,400))
num 2730398
> 

原始代码的预期结果

bash>./steam_h_pT 1e5 400
2730397.845968

现在,为什么它在R中被四舍五入?

2 个答案:

答案 0 :(得分:3)

这就是R格式化数字的方式。互操作很好,从C返回的值,由R保持,具有完全的精度。它只是显示值的四舍五入。

x <- 2730397.845968
str(x)

输出

num 2730398

而不是str使用输出更高精度的函数。例如:

print(steam_h_pT(100000,400), digits=16)

答案 1 :(得分:2)

digits函数的print参数引起的表示。该号码仍然存储正确。

2730397 + 0.845968
[1] 2730398
print(2730397 + 0.845968, digits=15)
[1] 2730397.845968

您可以使用options(digits=15)设置全局默认值。