1

我有一个使用泰勒级数创建科学计算器的项目。此外,我正在分析一个数字到 ieee 754 标准浮点系统。

在我的计算器中,用户选择他们想要单精度还是双精度:我使用浮点和双精度变量,然后按照 ieee 754 规范分析数字。

如果用户想要双精度,则分析如下:

double analyze=3.45
BigDecimal bd=new BigDecimal(analyze) 

这给了我

3.45000000000000017763568394002504646778106689453125
  1. 这个数字是以二进制格式存储在电脑内存中的实际数字吗?

  2. 如果不是,我可以得到所存储数字的真实值吗?

  3. 还有为什么会这样?

    double analyze=0.5
    BigDecimal db=new BigBecimal(analyze)

它只打印0.5- 为什么我会丢失有效数字?

谁能告诉我为什么会这样

        BigDecimal one=new BigDecimal(0.1);
        BigDecimal five=one.multiply(new BigDecimal(5)) ;
        System.out.println("5 times 0.1 is "+" "+ five);

        System.out.println("But the 0.5 in BigDecimal is " + " "+ new BigDecimal(0.5));

通过运行这个你得到 5 倍 0.1 是 0.5000000000000000277555756156289135105907917022705078125 但是 BigDecimal 中的 0.5 是 0.5

4

4 回答 4

3

1.我想问你这个数字是不是以二进制格式存储在电脑内存中的实际数字?

是的。

2.如果不是,我可以得到所存储数字的真实值

嗯,是的,所以没问题。

  1. 它只打印我 --> 0.5 为什么我会丢失有效数字?

你没有;0.5是以二进制格式存储的确切数字。

于 2012-12-17T20:51:03.347 回答
3
  1. 是的,当您将数字“3.45”转换为常见的双精度格式时,3.450000000000000017763568394002504646778106689453125 是存储在双精度中的实际值。

  2. 这才是真正的价值。

  3. 您没有显示打印 0.5 的方法。我记得,Java 中的一种常见显示机制只是打印尽可能多的数字来准确表示值,如果可能的话。它不打印尾随零,因为它们是多余的。

您可能想知道“好吧,如果只打印 0.5,我怎么知道这个数字是 0.5000000000 而不是 0.5000000001 或类似的东西?” 答案是,如果数字与 0.5 不同,则会打印更多数字,因为已定义显示机制来执行此操作。因此,您可以相信“.5”意味着 .5,仅此而已,仅此而已。

如果这是一个学校项目,那么您可能不需要担心 3.45 会以稍微不同的值表示。继续使用双精度值进行计算。

此外,泰勒级数对于真正的计算器来说是一个糟糕的选择,因为它们被设计为在一个点附近是准确的,但你会想要一个在一个区间内准确的级数。还有其他系列可以更好地分散他们的错误,因此他们需要更少的术语来获得准确的结果。如果建议作为学校项目的一部分,我只会使用泰勒级数。

于 2012-12-17T21:51:54.017 回答
1
  1. 是的。BigDecimal(double)构造函数“将double 转换为 BigDecimal,BigDecimal 是 double 的二进制浮点值的精确十进制表示。” BigDecimal toString方法显示确切的值。

  2. 不适用

  3. 0.5 完全可以表示为双精度数。BigDecimal(0.5) 结果具有未缩放的值 5 和缩放 1。它满足 BigDecimal toString条件,无需指数即可显示。小数点后的位数等于小数位数,1。

您的示例代码:

    BigDecimal one=new BigDecimal(0.1);
    BigDecimal five=one.multiply(new BigDecimal(5)) ;

除非您正在探测双重表示,否则使用 BigDecimal 双重构造函数会带来问题。0.1 不能完全表示为双精度数,因此您的“一”不完全是 0.1,即使BigDecimal("0.1")是准确的。

更一般地,双精度数的精确值始终具有a/(2**b)其中ab是整数并"**"表示幂的形式。(a * 5**b)/(10**b)具有相同的值,并且可以精确地表示为比例为 b 的 BigDecimal。

于 2012-12-18T01:13:17.627 回答
-2

通常,float 和 double不会精确地表示十进制数(除了 2 的幂和其他一些“甜蜜点”)。该数字以二进制形式在内部存储。Double.doubleToRawLongBits您可以使用或访问内部表示Float.floatToRawIntBits

于 2012-12-17T20:57:34.100 回答