我有一个快速的问题。所以,假设我有一个非常大的数字,最多 15 位数字,我会接受输入并将其分配给两个变量,一个浮点数和一个双精度数,如果我要比较两个数字,你会如何比较它们?我认为 double 的精度高达 15 位?float 有 8 个?那么,我是简单地比较它们,而浮点数只包含 8 个数字并填充其余的数字,还是让浮点数打印出所有 15 个数字然后进行比较?另外,如果我被要求打印出浮点数,标准的做法是打印最多 8 位数字吗?这是它的最大精度
谢谢
我有一个快速的问题。所以,假设我有一个非常大的数字,最多 15 位数字,我会接受输入并将其分配给两个变量,一个浮点数和一个双精度数,如果我要比较两个数字,你会如何比较它们?我认为 double 的精度高达 15 位?float 有 8 个?那么,我是简单地比较它们,而浮点数只包含 8 个数字并填充其余的数字,还是让浮点数打印出所有 15 个数字然后进行比较?另外,如果我被要求打印出浮点数,标准的做法是打印最多 8 位数字吗?这是它的最大精度
谢谢
大多数语言都会进行某种形式的类型提升,以让您比较不相同但相当相似的类型。有关详细信息,您必须指出您所指的语言。
当然,比较浮点数的真正问题在于,由于舍入误差,结果可能出乎意料。大多数数学等式不适用于浮点算术,因此应该产生相同值的两个操作序列实际上可能会产生稍微不同的值(如果不小心,甚至会产生非常不同的值)。
编辑:至于打印,“标准方式”取决于您的需要。如果出于某种原因,您正在使用浮点数进行货币计算,那么您可能只想打印 2 个十进制数字。
在这里用数字来思考可能是个问题。浮点数的范围可以从负无穷到正无穷。例如,在 C# 中,范围为 ±1.5 × 10^−45 到 ±3.4 × 10^38,精度为 7 位。
此外,IEEE 754 定义了浮点数和双精度数。这是一个可能有帮助的链接http://en.wikipedia.org/wiki/IEEE_floating_point
你的问题是正确的。不过,您要考虑您的方法。
无论是 32 位还是 64 位,浮点表示并不意味着比较数字是否相等。例如,2.0/7.0 == 60.0/210.0
在 CPU 看来,断言可能正确,也可能不正确。从概念上讲,浮点本质上是不精确的。
如果您想比较数字是否相等,请使用整数。再次考虑最后一段的比率。这个断言2*210 == 7*60
总是正确的——注意这些是与以前相同的四个数字的整数版本,只使用乘法而不是除法。有人怀疑你真正要找的是这样的东西。