0

ケース

dyn.loading用の共有ライブラリをRにコンパイルしました。次に、RIでラッパー関数を呼び出すと、小数点以下の切り捨て部分で結果が丸められます。.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で丸められるのですか?

4

2 に答える 2

3

これが、Rが数値をフォーマットする方法です。相互運用性は良好であり、Cから返され、Rによって保持される値は完全な精度を持っています。値を丸めているのはディスプレイだけです。

x <- 2730397.845968
str(x)

出力

num 2730398

strより正確に出力する関数を使用する代わりに。例えば:

print(steam_h_pT(100000,400), digits=16)
于 2012-10-05T21:56:55.577 に答える
2

関数へのdigits引数による表現です。print番号はまだ正しく保存されています。

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

グローバルデフォルトは。で設定できますoptions(digits=15)

于 2012-10-05T21:58:29.110 に答える