我巴德一大五杀 2020-07-10 10:58 采纳率: 100%
浏览 373
已采纳

为什么C++中long double在e-19精度下开方计算结果不正确?

小弟最近学习使用C++编程,在编程过程中子函数里遇到一个数量级为e-19的小数,方程里的参数数值类型都为long double,方程里所有参数的值都是正确的,但是方程无法计算初正确结果,有哪位大神可以指点一下让代码运行出正确结果,代码和运行结果如下

#include <iostream>
#include "math.h"
int  main(void)
{
 long double  z0, ax, ay, y0 ,delta_i, delta_e, y1, y2,ro,ri,d;
 ax = 3.274562789467620e-4;
 ay = 1.071061271913181e-3;
 z0 = 9.355885717696390e-5;
 y0 = 3.060172456885287e-4;
 ri = 8.800000608712444e-3;
 ro = 8.320000090002999e-3;
 d = 1.600000075995922e-2;
 y1 = 0;
 y2 = 0;
 delta_e = sqrtl((z0*1e8 - y1 * 1e8)*(z0*1e8 - y1* 1e8) + (y0*1e8 + y2 * 1e8)*(y0*1e8 + y2 * 1e8));
 delta_e = delta_e / 1e8 - (ro - 0.5*d);
 delta_i = sqrtl((ax *1e8 - z0 *1e8 + y1 * 1e8)*(ax *1e8 - z0 *1e8 + y1 * 1e8) + (ay*1e8 - y0 *1e8 - y2 * 1e8)*(ay*1e8 - y0*1e8 - y2 * 1e8));
 delta_i = delta_i / 1e8 - (ri - d *0.5);
}

结果如下

为什么delta_e的结果是正确的,而delta_i的结果却是0?
而且将delta_e计算中的参数与别的数量级的数比如1e10 而不是1e8相乘 的话那delta_e的结果也不正确。
希望能够实现结果
附正确结果:delta_e=5.421010862427522e-20
delta_i=1.084202172485504e-19

  • 写回答

6条回答 默认 最新

  • EduardCHED 2020-07-18 09:48
    关注

    首先还是精度要求太高了,long double只能保证17~18位的存储精度,超出部分知识随机赋值,显示的结果并不是真正的数值,可以采用字符串表示数值,达到更高的精度要求

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效