gpt4 book ai didi

r - R 中数值的 double (64 位)表示(符号、指数、有效数)

转载 作者:行者123 更新时间:2023-12-03 16:56:16 25 4
gpt4 key购买 nike

R FAQ指出:

The only numbers that can be represented exactly in R’s numeric type are integers and fractions whose denominator is a power of 2. All other numbers are internally rounded to (typically) 53 binary digits accuracy.



R 使用 IEEE 754 double 浮点数
  • 1 位符号
  • 11 位用于指数
  • 尾数(或有效数)的 52 位

  • 总和为 64 位。

    对于数字 0.1 , R 代表
    sprintf("%.60f", 0.1)
    [1] "0.100000000000000005551115123125782702118158340454101562500000"

    Double (IEEE754 Double precision 64-bit)为我们提供了 0.1 的二进制表示:
    00111111 10111001 10011001 10011001 10011001 10011001 10011001 10011010

    我们如何在 R 中获得这种表示,以及它与 sprintf 给出的输出有何关系在我们的例子中?

    最佳答案

    @chux 在评论中提出的问题的答案是"is"; R支持 %a格式:

    sprintf("%a", 0.1)
    #> [1] "0x1.999999999999ap-4"

    如果要访问底层位模式,则必须将 double 重新解释为 64 位整数。对于此任务,可以通过 Rcpp 使用 C++:
    Rcpp::cppFunction('void print_hex(double x) {
    uint64_t y;
    static_assert(sizeof x == sizeof y, "Size does not match!");
    std::memcpy(&y, &x, sizeof y);
    Rcpp::Rcout << std::hex << y << std::endl;
    }', plugins = "cpp11", includes = "#include <cstdint>")
    print_hex(0.1)
    #> 3fb999999999999a

    此十六进制表示与您的二进制表示相同。如何获得十进制表示?
  • 第一位为零,因此符号为正
  • 指数是 0x3fb,即十进制的 1019。鉴于 exponent bias这对应于 -4 的实际指数。
  • 尾数是 0x1999999999999a × 2^-52 包括 implicit 1 ,即 2^−52 × 7,205,759,403,792,794。
  • 总共得到 2^−56 × 7,205,759,403,792,794:
    sprintf("%.60f", 2^-56 * 7205759403792794)
    #> [1] "0.100000000000000005551115123125782702118158340454101562500000"
  • 关于r - R 中数值的 double (64 位)表示(符号、指数、有效数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50217954/

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