很小数相除的浮点型精度问题,求指教

iam1210900506 2013-01-29 04:53:37
编程时算法遇到问题,分析原因可能是由于出现类似 很小数/很大数 类型的算式,导致机器截断误差,精度不够导致。本人是摄影测量专业,精度要求就很高,求解决办法。发现double型不够用,有什么精度更高的浮点型?奇怪的类型请给出使用方法,谢谢
...全文
164 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
caoh110 2013-01-30
  • 打赏
  • 举报
回复
一般double类型都够用了,我是搞科学计算的,我想你摄影专业的应该也够了
oN5GrzoN 2013-01-30
  • 打赏
  • 举报
回复
我在做地球椭球投影的时候(也是测量学的),公司也是需要高精度,网上有很多成熟的大数类。 可惜我忘了那个有官网的大数类。只现成找了这个 http://bbs.csdn.net/topics/190173310
dingqiang107 2013-01-30
  • 打赏
  • 举报
回复
C++标准有long double型,但不一定比double精度高,你可以先在你的系统中试一下。 x86架构上多数编译器支持80位的long double,包括Intel和GCC。但是VC++中long double和double是一样的。 GCC上有非标准的__float128。 如果不行,可以试试 GNU MP,任意精度整数、分数、浮点数 (http://gmplib.org/)。
赵4老师 2013-01-29
  • 打赏
  • 举报
回复
用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10) 同理,用二进制小数也不能精确表示某些10进制小数。 include\float.h
...
#define DBL_DIG         15                      /* # of decimal digits of precision */
#define DBL_EPSILON     2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */
#define DBL_MANT_DIG    53                      /* # of bits in mantissa */
#define DBL_MAX         1.7976931348623158e+308 /* max value */
#define DBL_MAX_10_EXP  308                     /* max decimal exponent */
#define DBL_MAX_EXP     1024                    /* max binary exponent */
#define DBL_MIN         2.2250738585072014e-308 /* min positive value */
#define DBL_MIN_10_EXP  (-307)                  /* min decimal exponent */
#define DBL_MIN_EXP     (-1021)                 /* min binary exponent */
#define _DBL_RADIX      2                       /* exponent radix */
#define _DBL_ROUNDS     1                       /* addition rounding: near */
...
bravery36 2013-01-29
  • 打赏
  • 举报
回复
如果真的需要高精度的话,可以考虑下实现大数的加减乘除(假如说这样的运算就足够了的话),实现方法一般是用数组存储,具体的可以百度。不过这样做有很大局限性,最明显的问题就是只能做简单的运算,用不了其他库函数。
mujiok2003 2013-01-29
  • 打赏
  • 举报
回复

//因为浮点数在计算机中都误差,如果对精度要求很高,就不要用了。

#include <stdio.h>

typedef struct tagFloat
{
  int exponent; //指数
  int mantisa;  //尾数
}Float;


int main()
{
   
   double a = 0.0001, b = 200000, c = a / b;
   printf("%lf\n", c);
   Float x = {-4, 1}, y = {5, 2}, z = {-5-5, 10/2}; // z = x / y
   printf("%dE%d", z.mantisa, z.exponent);
   return 0;
}
/*
0.000000
5E-10
*/


derekrose 2013-01-29
  • 打赏
  • 举报
回复
用字符串?

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧