在Julia中:BigFloat RoundFromZero看起来很奇怪

时间:2018-09-09 19:46:32

标签: julia arbitrary-precision multiprecision

在Julia 1.0.0 REPL中,我得到以下行为。第一行是文档中的示例 https://docs.julialang.org/en/v1/base/math/#Base.Rounding.RoundFromZero

public void Dijkstra(int start) {
        int[] D = new int[E.length];
        for (int i = 0; i < E.length; i++) {
            D[i] = Integer.MAX_VALUE;
        }
        D[start] = 0;
        PriorityQueue<Integer> Q = new PriorityQueue<>();
        Q.add(start);
        while (!Q.isEmpty()) {
            Integer u = Q.poll();
            System.out.println(u + " ");
            for (int z = 0; z < E[u].size(); z++) {
                Edge e = E[u].get(z);
                if ((D[u] + e.w) < D[e.v]) {
                    D[e.v] = D[u] + e.w;
                    Q.add(e.v);
                }
            }
        }
        System.out.println(D[E.length - 1]);
    }

我不清楚上面示例中5的含义。例如,

julia> BigFloat("1.0000000000000001", 5, RoundFromZero)
1.06

似乎将要四舍五入的两个数字应四舍五入为REPL中的不同输出。我想念什么?

1 个答案:

答案 0 :(得分:2)

该值从零开始舍入为5位精度,并且在两种情况下均等于1.0625。您可以使用以下方法进行检查:

julia> Float64(BigFloat("1.01", 5, RoundFromZero))
1.0625

julia> big(0)+BigFloat("1.01", 5, RoundFromZero)
1.0625

或(这是黑客行为,不应该这样做):

julia> x = BigFloat("1.01", 5, RoundFromZero)
1.06

julia> x.prec = 10
10

julia> x
1.0625

julia> Base.MPFR._string(x, 10)
"1.0625"

现在打印1.06的原因是Julia对输出进行了四舍五入(在这种情况下,这是MPFR外部库的默认四舍五入)。

相关问题