作者SmallBeeWayn (喵喵叫的蜜蜂猫)
看板Programming
标题Re: [问题] no math.h, 如何判断一浮点数 是否为整数
时间Wed Sep 28 02:35:54 2011
※ [本文转录自 C_and_CPP 看板 #1EWXTIHA ]
作者: SmallBeeWayn (喵喵叫的蜜蜂猫) 看板: C_and_CPP
标题: Re: [问题] no math.h, 如何判断一浮点数 是否为整数
时间: Wed Sep 28 02:34:55 2011
注:我C不强,以下是用直接语意混合VB.2010写法
C语言版那边似乎也有一些讨论了
以原PO提到的大数字(超过Integer精度)问题
一解是直接去解析结构,另外一解就是转文字处理
Function IsInt(ByVal X As Double) As Boolean
Dim S As String = X.ToString
If S包含文字"." Then
If S包含文字"e" Then
Dim Y() As String = 分离S藉由"e"
Return (Y(0)部分最小位数不包含小数)
Else Return False
Else Return True
End Function
==============================
但是还有两个问题
1.浮点数的储存方式是以1/2,1/4,1/8这样累加起来的
这造成不能正确表示所有的整数(尤其当数字很大时)
例如说某种浮点储存表示法无法表示17只能表示成16.994140625
(14+1.75+0.875+0.21875+0.109375+0.02734375+0.013671875)
(以14为基底,10bit长度)
当进行是否为整数判断时,这会是一个问题
当然,现在的双精度(64bit)浮点数不容易遇到这种问题,不过还是会发生
2.计算的累积误差
浮点数经过一系列的加减乘除之後,由於其输入精度有限,输出精度也会产生累积误差
以整数来说,如果我们硬要用整数去算0.7+0.5希望得到1 (0.7+0.5=1.2 四舍五入到1)
但实际上我们会得到2 (1+1=2, 因为两数皆四舍五入),或是0 (两数都直接舍去小数)
浮点数同样有类似的问题
如果我们今天得到一个计算结果16.99999
而误差为小数以下两位,那这个结果为整数
如果误差为小数六位,那这个结果就是浮点数了...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.116.180.163
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.116.180.163