我巴德一大五杀 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条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器