gpt4 book ai didi

c# - 如何存储一个非常小的数字

转载 作者:太空宇宙 更新时间:2023-11-03 17:24:30 25 4
gpt4 key购买 nike

我有一个公式来计算 C# 中一些数字的权重。我有9个重量。这些权重的总和为 1,所以这些都太小了。例如,在计算这些权重后,结果如下所示:

1/17、1/17、1/17、1/17、1/17、1/17、1/17、1/17、9/17

当我想将这些权重存储在 double 类型的参数中时,存储的值将是:

0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0

问题是我需要这些权重的确切值才能在另一个公式中使用,而它们在那个公式中太重要了。它们的总和应该是1。

我能做些什么来解决这个问题?

最佳答案

A double is perfectly capable of storing about 1/17.它将无法以完美的准确性和精确度做到这一点。但也许这对你来说就足够了。您的错误可能是使用整数除法。试试 1.0/17.0

只有可以存储 a/b 形式的一小部分的数据类型才能准确存储 1/17。任何有限精度的数字都不能(并且由于计算机内存是有限的,所以所有数字都是有限精度的)。

让我们要求 SMT 求解器 Z3 提供一个示例,其中 1.0/divisor*divisor != 0.0An example for floats is :

    float divisor = (float)(int)(1.296875 * 64);
Console.WriteLine(divisor); //83
Console.WriteLine(1.0f/divisor*divisor == 1.0); //False

使用以下 SMTlib input with Z3 online 找到:

(set-logic QF_FPA)    

(declare-const x (_ FP 8 24))
(declare-const divisor (_ FP 8 24))
(declare-const r1 (_ FP 8 24))
(declare-const r2 (_ FP 8 24))

(assert (and
(not (or (= x (as NaN (_ FP 8 24))) (= x (as plusInfinity (_ FP 8 24))) (= x (as minusInfinity (_ FP 8 24)))))
(not (or (= divisor (as NaN (_ FP 8 24))) (= divisor (as plusInfinity (_ FP 8 24))) (= divisor (as minusInfinity (_ FP 8 24)))))
(not (or (= r1 (as NaN (_ FP 8 24))) (= r1 (as plusInfinity (_ FP 8 24))) (= r1 (as minusInfinity (_ FP 8 24)))))
(not (or (= r2 (as NaN (_ FP 8 24))) (= r2 (as plusInfinity (_ FP 8 24))) (= r2 (as minusInfinity (_ FP 8 24)))))
(> divisor ((_ asFloat 8 24) roundTowardZero 2.0 0))
(< divisor ((_ asFloat 8 24) roundTowardZero 100.0 0))
(== divisor (roundToIntegral roundTowardZero divisor))
(= x ((_ asFloat 8 24) roundTowardZero 1.0 0))
(= r1 (/ roundNearestTiesToEven x divisor))
(= r2 (* roundNearestTiesToEven r1 divisor))
(not (== r2 ((_ asFloat 8 24) roundTowardZero 1.0 0)))
))

(check-sat)
(get-model)

Z3 对 IEEE float 进行了位精确推理。生成的模型是:

(model 
(define-fun r2 () (_ FP 8 24)
(as +1.99999988079071044921875p-1 (_ FP 8 24)))
(define-fun divisor () (_ FP 8 24)
(as +1.296875p6 (_ FP 8 24)))
(define-fun x () (_ FP 8 24)
(as +1p0 (_ FP 8 24)))
(define-fun r1 () (_ FP 8 24)
(as +1.54216861724853515625p-7 (_ FP 8 24)))
)

关于c# - 如何存储一个非常小的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25969477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com