R 产生四舍五入数的C函数

R 产生四舍五入数的C函数,r,R,案例 #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

案例

#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); }
bash>./steam_h_pT 1e5 400
2730397.845968
我已经编译了用于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); }
bash>./steam_h_pT 1e5 400
2730397.845968
原始代码的预期结果

#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); }
bash>./steam_h_pT 1e5 400
2730397.845968

现在,为什么它会在R中取整?这就是R格式化数字的方式。互操作很好,并且从C返回的值(由R持有)具有完全的精度。只是显示器在舍入数值

x <- 2730397.845968
str(x)
使用输出精度更高的函数,而不是
str
。例如:

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

这就是R格式化数字的方式。互操作很好,并且从C返回的值(由R持有)具有完全的精度。只是显示器在舍入数值

x <- 2730397.845968
str(x)
使用输出精度更高的函数,而不是
str
。例如:

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

它将
数字
参数的表示形式转换为
打印
函数。号码仍然正确存储

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

您可以使用
选项(数字=15)
设置全局默认值,将
数字
参数设置为
打印
函数。号码仍然正确存储

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

您可以使用
选项(数字=15)
设置全局默认值,谢谢您的解释。这太令人困惑了。谢谢你的解释。这很令人困惑。