当前位置: 首页 > 面试题库 >

在Go运算中处理浮点数精度?

上官凯泽
2023-03-14
问题内容

我对在Go中精确减去2个float的方法感兴趣。

我尝试使用该 math/big库,但无法获得准确的结果。

我使用Javascript中的big.js库解决了此问题。Go算法是否有类似的库/方法?

    package main

    import (
        "fmt"
        "math/big"
    )

    func main() {
        const prec = 200
        a := new(big.Float).SetPrec(prec).SetFloat64(5000.0)
        b := new(big.Float).SetPrec(prec).SetFloat64(4000.30)
        result := new(big.Float).Sub(a, b)
        fmt.Println(result)
    }
    Result: 999.6999999999998181010596454143524169921875

https://play.golang.org/p/vomAr87Xln


问题答案:

包装大

导入“数学/大”

func(* Float)字符串

func (x *Float) String() string

字符串格式x类似于x.Text(’g’,10)。(必须显式调用字符串,Float.Format不支持%s动词。)

使用字符串输入并四舍五入输出,例如,

package main

import (
    "fmt"
    "math/big"
)

func main() {
    const prec = 200
    a, _ := new(big.Float).SetPrec(prec).SetString("5000")
    b, _ := new(big.Float).SetPrec(prec).SetString("4000.30")
    result := new(big.Float).Sub(a, b)
    fmt.Println(result)
    fmt.Println(result.String())
}

输出:

999.6999999999999999999999999999999999999999999999999999999995
999.7

对于十进制,根据定义,二进制浮点数是一个近似值。例如,十进制数字0.1不能精确表示,大约为1.10011001100110011001101 * (2**(-4))

您已经习惯了这种事情,因为您知道重复小数,这是有理数的近似值:1 / 3 = .333...3227 / 555 = 5.8144144144...

参阅每位计算机科学家应了解的有关浮点算法的知识。



 类似资料:
  • 我尝试了两件事: 和:

  • 以下是go中的示例代码: 结果线A1、B1和C1之间的差异是可以理解的。然而,从A2开始到C2魔法来了。来自B2和C2的结果都与来自A2线的结果不匹配。对于x2行(x=A、B或C)也是如此——但是x2和x4的输出是相同的。 为了确保,让我们以二进制形式打印结果。 上面代码中的一些事实(一个在bin表单中): 行A11和C11之间有差异(最后一位数字——就在指数之前)。 行A12和C12几乎相同(除

  • 问题内容: 我有以下虚拟测试脚本: 这将打印结果,而仅打印结果(如果使用计算器)。据我了解,这是由于浮点乘法精度的错误。 有没有人有一个好的解决方案,这样在这种情况下我可以获得正确的结果?我知道还有类似的函数,或者四舍五入是另一种可能性,但是我真的想在不进行任何四舍五入的情况下打印出完整的数字。只是想知道你们中的一个人是否有一些不错的,优雅的解决方案。 当然,否则我将四舍五入到大约10位数字。 问

  • 问题内容: 我需要利用来自另一个系统的数字,这些数字是Java中的128位(四精度)浮点数。 考虑到Java中没有等效类型,我想使用Java代码降低数字的精度,以便将它们存储在Java double中。这可以在c或使用汇编中相当容易地完成,但是我想纯粹在java中完成。 可以假定四精度数存储在Java中的128位字节数组中。 是否有一个很好的解决方案,仅使用java?谢谢。 问题答案: 我对这个问

  • 问题 你需要对浮点数执行精确的计算操作,并且不希望有任何小误差的出现。 解决方案 浮点数的一个普遍问题是它们并不能精确的表示十进制数。 并且,即使是最简单的数学运算也会产生小的误差,比如: >>> a = 4.2 >>> b = 2.1 >>> a + b 6.300000000000001 >>> (a + b) == 6.3 False >>> 这些错误是由底层CPU和IEEE 754标准通过

  • 本文向大家介绍简单谈谈php浮点数精确运算,包括了简单谈谈php浮点数精确运算的使用技巧和注意事项,需要的朋友参考一下 bc是Binary Calculator的缩写。bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(string $left_operand, string $right_operand[, int $scale]),如果scale没有