[英]fread reads large integers as integer64, which are not upcasted to doubles in case of arithemetic expressions
當通過fread
讀取文件時,列可能被讀取為 integer64(正確如此),但是當這些列與numeric
相乘時,它們不會向上轉換為numeric
(如 C++ 或R
中的integers
)。 雖然這是bit64
package 中記錄的行為。但它並不直觀,當數字相乘等時。與integer
integer64
行為不同。
此外, integer64
除以integer
時給出一個numeric
變量。 所以行為很奇怪!
那么我們是否應該總是害怕使用fread
colClasses = numeric
來將列用於帶有numeric
等的算術表達式?
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
時將無法正常運行。 這個問題蔓延到所有使用integer64
的類,比如nanotime
這是bit64
package 的記錄行為,請參閱?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
為避免這種情況,您可以將fread
的integer64
參數設置為"double"
。 小心使用,因為存在未解決的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.