我正在用C++/Qt做小雙數的計算,發生了一些奇怪的事情。在下面的代碼中,t_prob的值應該是1.62457e-12,但它是3.24907e-12(如2 * 1.62457e-12)。用C++計算小雙數的錯誤
同時,我用a,b,c和d添加了一個控件,結果是正確的。
你能否給我一些關於這個問題的建議。提前致謝。
#include <QDebug>
#include <QtMath>
#define PI 3.1415926536
double tprob(qint64 n, double x);
int main(int argc, char *argv[])
{
double a = 1.0;
double b = 0.00000000000162448;
double c = a - b;
double d = 1.0 - c;
qDebug() << "a:" << a;
qDebug() << "b:" << b;
qDebug() << "c:" << c;
qDebug() << "d:" << d;
double df = 127.793;
double t_statistic = 9.77749;
double ta = tprob(floor(df),-1.0 *t_statistic);
double tb = tprob(floor(df), t_statistic);
double t_prob = 1.0 - qAbs(ta - tb);
qDebug() << "df:" << df;
qDebug() << "t_statistic:" << t_statistic;
qDebug() << "ta:" << ta;
qDebug() << "tb:" << tb;
qDebug() << "t_prob:" << t_prob;
return 1;
}
double tprob(qint64 n, double x){
if(n < 0){
qDebug() << "[error] wrong n value input for tprob";
exit(0);
}
double a,b,w,z,y,p;
w=atan2(1.0 * x/sqrt(n),1);
z=cos(w)*cos(w);
y=1.0;
p=0;
for(qint64 i=n-2; i>=2;i-=2){
y= 1 + 1.0 * (i-1)/i * z * y;
}
if(n%2 ==0){
a=sin(w)/2;
b=0.5;
}else{
a = (n==1)?0:sin(w)*cos(w)/PI;
b = 0.5 + w/PI;
}
p = 1- b - a * y;
if(p>0){
return p;
}else{
return 0;
}
}
輸出:
a: 1.62448e-12
b: 1
c: 1
d: 1.62448e-12
df: 127.793
t_statistic: 9.77749
ta: 1
tb: 1.62457e-12
t_prob: 3.24907e-12
可以給你的程序做什麼更精確?什麼是'df'和't_statistic'變量? –
看起來像浮點精度工作... http://coliru.stacked-crooked.com/a/1b56ef29755bceb0 –
@Marcel這是一個大型項目的一部分,我想在這一節進行t檢驗,並且完成的公式爲t_prob = 1.0- qAbs(tprob(floor(df), - 1.0 * t_statistic) - tprob(floor(df),t_statistic))'''''''''''''''與功能'tprob',它已成功測試。 – ybzhao