日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

判断浮点数溢出的方法

發布時間:2025/3/21 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 判断浮点数溢出的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

出處:http://blog.csdn.net/delphiwcdj/article/details/6261931

方法1:判斷是否溢出,一是使用函數判斷,二是與最大最小值比較

#include <cstdio>
#include <cmath>
#include <cfloat>
int main()
{
// double類型
double dval1 = 1.2;
double dval2 = 1.2*pow((double)10,308);
double dval3 = 1.2*pow((double)10,309);
printf("%d/n",_finite(dval1));// 1 未溢出
printf("%d/n",_finite(dval2));// 1?
printf("%d/n",_finite(dval3));// 0 溢出
if (dval1 > DBL_MAX || dval1 < DBL_MIN)
printf("overflow/n");
if (dval2 > DBL_MAX || dval2 < DBL_MIN)
printf("overflow/n");
if (dval3 > DBL_MAX || dval3 < DBL_MIN)
printf("overflow/n");
// float類型
float fval1 = 1.2f;
float fval2 = 1.2f*(float)pow((double)10,38);
float fval3 = 1.2f*(float)pow((double)10,39);
printf("%d/n",_finite(fval1));// 1 未溢出
printf("%d/n",_finite(fval2));// 1?
printf("%d/n",_finite(fval3));// 0 溢出
if (fval1 > FLT_MAX || fval1 < FLT_MIN)
printf("overflow/n");
if (fval2 > FLT_MAX || fval2 < FLT_MIN)
printf("overflow/n");
if (fval3 > FLT_MAX || fval3 < FLT_MIN)
printf("overflow/n");
return 0;


#include <iostream>
#include <float.h>
using namespace std; ? ?
int main()
{
float f = 0.f;
float d = -100.f / f;// -1.#INF000
if (d > FLT_MAX || d < FLT_MIN)
cout<<"error"<<endl;
float x = 1e100;
if (x > FLT_MAX || x < FLT_MIN)
cout<<"error"<<endl;
return 0;
}

?方法2:捕獲浮點數溢出異常

#include <cstdio>
#include <cmath>
#include <cfloat>
#include <fpieee.h>
#include <excpt.h>
#include <float.h>
int fpieee_handler(_FPIEEE_RECORD *pieee)
{
if (pieee->Cause.Overflow == 1) {// 處理溢出
return EXCEPTION_CONTINUE_EXECUTION;
} else {
return EXCEPTION_EXECUTE_HANDLER;
}
}
int main()
{
__try {
unsigned int u;
unsigned int control_word;
_controlfp_s(&control_word, 0, 0);
u = control_word & (~_EM_OVERFLOW);
_controlfp_s( &control_word, u, _MCW_EM);
// 你的代碼
// double類型
double dval3 = 1.2*pow((double)10,309);
printf("%d/n",_finite(dval3));// 0 溢出=> 1
if (dval3 > DBL_MAX || dval3 < DBL_MIN)
printf("overflow/n");
// float類型
float fval3 = 1.2f*(float)pow((double)10,39);
printf("%d/n",_finite(fval3));// 0 溢出=> 1
if (fval3 > FLT_MAX || fval3 < FLT_MIN)
printf("overflow/n");
}
__except (_fpieee_flt(GetExceptionCode(),
GetExceptionInformation(),
fpieee_handler)){
}
}

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 */
#define FLT_DIG ? ? ? ? 6 ? ? ? ? ? ? ? ? ? ? ? /* # of decimal digits of precision */
#define FLT_EPSILON ? ? 1.192092896e-07F ? ? ? ?/* smallest such that 1.0+FLT_EPSILON != 1.0 */
#define FLT_GUARD ? ? ? 0
#define FLT_MANT_DIG ? ?24 ? ? ? ? ? ? ? ? ? ? ?/* # of bits in mantissa */
#define FLT_MAX ? ? ? ? 3.402823466e+38F ? ? ? ?/* max value */
#define FLT_MAX_10_EXP ?38 ? ? ? ? ? ? ? ? ? ? ?/* max decimal exponent */
#define FLT_MAX_EXP ? ? 128 ? ? ? ? ? ? ? ? ? ? /* max binary exponent */
#define FLT_MIN ? ? ? ? 1.175494351e-38F ? ? ? ?/* min positive value */
#define FLT_MIN_10_EXP ?(-37) ? ? ? ? ? ? ? ? ? /* min decimal exponent */
#define FLT_MIN_EXP ? ? (-125) ? ? ? ? ? ? ? ? ?/* min binary exponent */
#define FLT_NORMALIZE ? 0
#define FLT_RADIX ? ? ? 2 ? ? ? ? ? ? ? ? ? ? ? /* exponent radix */
#define FLT_ROUNDS ? ? ?1 ? ? ? ? ? ? ? ? ? ? ? /* addition rounding: near */
...



總結

以上是生活随笔為你收集整理的判断浮点数溢出的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。