簡體   English   中英

fread 將大整數讀取為 integer64,在算術表達式的情況下不會向上轉換為雙精度數

[英]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

為避免這種情況,您可以將freadinteger64參數設置為"double" 小心使用,因為存在未解決的問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM