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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

写出float x 与“零值”比较的if语句——一道面试题分析

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 写出float x 与“零值”比较的if语句——一道面试题分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

***************************************************

更多精彩,歡迎進入:http://shop115376623.taobao.com

***************************************************


寫出float? x 與“零值”比較的if語句

請寫出 float??x 與“零值”比較的 if 語句:?
const float EPSINON = 0.00001;?
if ((x >= - EPSINON) && (x <= EPSINON)
?
不可將浮點變量用“==”或“!=”與數字比較,應該設法轉化成“>=”或“<=”此類形式。?

EPSINON應該是一個很小的值吧?? 因為計算機在處理浮點數的時候是有誤差的,所以判斷兩個浮點數是不是相同,是要判斷是不是落在同一個區間的,這個區間就是?? [-EPSINON,EPSINON]?? EPSINON一般很小,10的-6次方以下吧,具體的好像不確定的,和機器有關

出處:http://topic.csdn.net/t/20041126/10/3590118.html

[結論]
浮點數等值比較使用下式:
#include?
#include?
fabs(a - b) < FLT_EPSILON

三個EPSILON:
FLT_EPSILON
DBL_EPSILON
LDBL_EPSILON


為什么浮點數不能直接作“等值比較”?
在以前看書或看文章就知道有這件事了。知道是因為“精度”,但一直沒有真正想過問題的嚴重性。
今天在易自考www.ezikao.com.cn看到一個帖子,順便搜索了一下,測試結果讓我信服了這條規則:
易自考帖子:http://www.ezikao.com.cn/bbs_disp.asp?boardid=47&id=79506

以下內容引用自林銳《高質量C/C++代碼編寫指南》

4.3.3 浮點變量與零值比較
? 【規則4-3-3】不可將浮點變量用“==”或“!=”與任何數字比較
千萬要留意,無論是float還是double類型的變量,都有精度限制。所以一定要避免將浮點變量用“==”或“!=”與數字比較,應該設法轉化成“>=”或“<=”形式。
假設浮點變量的名字為x,應當將?
if (x == 0.0) // 隱含錯誤的比較
轉化為?
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON是允許的誤差(即精度)。




最好定義一個符號常量來做。#define EPSINON 1e-6


我想是因為浮點數表示范圍大,如果一個數已經很小的時候,就可以認為是0了,epsinon嘛,limit,極限什么的。
也可以想一下,0.9無限循環不是等于1嗎?
如果正好某個值等于0.9循環,浮點數只能給出一個“確定”的值,那就會“做錯題”。

我想原理大約是這樣的。具體的嘛,我還沒有弄清楚 :)

再經過搜索后,寫下如下一段話:


好了,終于找到不完整的答案了。反正我是絕不會再將浮點數直接比較了:
參見帖子:http://blog.joycode.com/joe/archive/2004/12/07/40592.aspx

我參照這篇文章寫了這個例子:
#include <stdio.h>
#include <stdlib.h>

main()
{
??? float d1, d2, d3, d4;

??? d1 = 194268.02;
??? d2 = 194268;
??? d4 = 0.02;
????
??? d3 = d1 - d2;
??? if (d3 > d4)
?????? printf(">0.02/n");
??? else if (d3 < d4)
?????? printf("<0.02/n");
??? else
?????? printf("=0.02/n");????

??? printf("%f - %f = %f /n", d1,d2,d3);

??? system("pause");
}

請看結果:
<0.02
194268.015625 - 194268.000000 = 0.015625

即:194268.02 - 194268.0 不等于 0.02!
存進去的數居然會變!怕了吧?

4個變量改成double型的,再測試:
這是結果
<0.02
194268.020000 - 194268.000000 = 0.020000
明明是0.02啊,怎么還是小于?
這次沒有改我存的數了吧?WHY?

我說,我怕了,以后我再不敢用浮點數直接作相等比較了!

還是那句話:浮點數都是有精度限制的。
所以你存的數,不一定就是你要的數。

雖然這件事很值得郁悶,不過我還是很高興又知道了點東西。


2005.10.10 晚繼續更新
關于EPSINON,可不是能隨便定義的!
而且應該能想到,double和float的EPSINON是不同的。
定義成什么呢?不必你去定義了,ANSI C已經定義了這些常量:
載入頭文件
#include?
就可以引用

FLT_EPSILON
DBL_EPSILON
LDBL_EPSILON

幾個常量了。

出處:http://hi.baidu.com/ecgql/blog/item/fde8d617c496f50ec83d6d7a.html?

總結

以上是生活随笔為你收集整理的写出float x 与“零值”比较的if语句——一道面试题分析的全部內容,希望文章能夠幫你解決所遇到的問題。

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