用C++计算小双精度数时出错
error in calculating small double number with C++
我正在使用C++/Qt对小双精度数进行计算,发生了一些奇怪的事情。在下面的代码中,t_prob的值应该是 1.62457e-12,但它是 3.24907e-12(如 2 * 1.62457e-12)。
同时,我添加了一个带有 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
当您使用 <<
打印浮点值时,默认情况下,您只能获得 6 位精度或其他数字。
比较:
qDebug() << "c:" << c;
output: 1
跟:
qDebug() << "c:" << QString("%1").arg(c, 0, 'g', 15);
output: "0.999999999998376"
所以 tprob = 1.0 - qAbs(ta - tb) = 1.0 - qAbs(1.0 - ε - ε) = 2*ε
相关文章:
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 检查是否以特定精度给出双精度
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- C 字符串返回字符串的整数/双精度/长整型值
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 如何使双精度值的 C++ 和 C# 中的结果相同
- 使用浮点数和双精度数的非常小数字的数学
- 为什么双精度数据类型在C++中出错?
- 在 C# 中从二进制值转换为双精度值时出错
- 将双精度转换为整数时出错
- 将lower_bound与矢量<对<字符串、双精度一起使用时出错>>
- 用C++计算小双精度数时出错
- 在双精度的 qt 中使用模运算符时出错
- 为双精度值分配内存时出错
- 将双精度*转换为双精度(*)出错
- 使用EXPECT_EQ计算双精度或浮点数的和时出错