1

当通过 读取文件时fread,列可能被读取为 integer64(正确),但是当这些与 相乘时numeric,它们不会向上转换为numeric(如在 C++ 中或integers在 中R)。虽然这是bit64包中记录的行为。但这并不直观,当数字相乘时等integer64行为与integer.

此外,integer64当除以integer给出一个numeric变量时。所以行为很离奇!

那么我们是否应该始终fread使用colClasses = numericfor 列用于与numericetc 的算术表达式?


    file contents
    x,y
    111,0.3
    2147483648,0.3

    > d <- fread(file)     
    > print(d$x*d$y)
            x       y
1:        111       0.3
2: 2147483648       0.3

> as.integer64(111) * 8e-2
integer64
[1] 9
> as.integer64(111) * 8 / 1e2
8.88

同样,quantiles其他 R 函数在integer64. 这个问题蔓延到所有使用integer64likenanotime

4

1 回答 1

3

这是bit64包的记录行为,请参阅算术精度和强制?bit64

我们引入 64 位长整数的事实——没有引入 128 位长双精度数——带来了一些微妙的挑战

乘法运算符 *将其第一个参数强制为 integer64,但允许其第二个参数也为 double:第二个参数在内部强制为“long double”,并且乘法的结果作为 integer64 返回

as.integer64(111) * 8e-2
integer64
[1] 9

除法/ 和幂 ^ 运算符还将它们的第一个参数强制转换为 integer64,并在内部将第二个参数强制转换为“long double”,它们以 double 形式返回

as.integer64(111) * 8 / 1e2
8.88

为避免这种情况,您可以将integer64参数设置fread"double"。要小心使用,因为有一个未解决的问题

于 2022-02-25T09:45:59.647 回答