簡體   English   中英

使用 R 中的 MASS::fractions 將浮點數轉換為分數時出現奇怪的結果

[英]strange results when converting floating point numbers to fractions using MASS::fractions in R

我正在嘗試做與這篇文章中討論的類似的事情,但在 R 而不是 Python 中。

然而:

require(MASS)
fractions(0.723618,max.denominator = 1000000)
#[1] 89/123

這似乎表明浮點數 0.723618 用分數 89/123 比用 361809/500000 更好地描述,這對我來說似乎不正確。

更令人費解的是:

fractions(0.7236,max.denominator = 100000000000)
#[1] 89/123

當然,將 0.7236 寫成 1809/5000 會更好,不是嗎?

你知道為什么會這樣嗎? 你覺得“正常”嗎?

對於上下文:我問是因為這會在嘗試為浮點數向量找到一個公分母 <= 1000000 時導致問題,人們可能希望使用該公分母將它們轉換為具有指定最小有效位數的整數向量位數。
這些奇怪的分母的出現,使得分母向量的 LCM 非常大。


編輯:Jon Spring 建議的后續行動

for (i in 1:18) (print(fractions(0.723618,cycles=i)))
#[1] 1
#[1] 2/3
#[1] 3/4
#[1] 5/7
#[1] 8/11
#[1] 13/18
#[1] 21/29
#[1] 34/47
#[1] 55/76
#[1] 89/123
#[1] 144/199
#[1] 40121/55445
#[1] 40265/55644
#[1] 80386/111089
#[1] 281423/388911
#[1] 361809/5e+05
#[1] 361809/5e+05
#[1] 361809/5e+05

然而:

fractions(0.3333,cycles=1)
#[1] 1/3
fractions(0.3333,cycles=10)
#[1] 1/3
fractions(0.3333,cycles=100)
#[1] 1/3
fractions(0.3333,cycles=100,max.denominator = 1000)
#[1] 1/3
fractions(0.3333,cycles=100,max.denominator = 10000)
#[1] 3333/10000

所以看起來確實, max.denominatorcycles這兩個參數在某種程度上決定了分母可以變得多大,但乍一看,這種關系看起來並不是很簡單。

這是僅考慮 max.denominator 並通過將其分配給一個大數字而忽略cycles的一種方法:

library(purrr)

max.denominator = 1000000
decimal_num <- 0.723618
max_cycles <- 1000
do_not_know_cycles <- map(1:max_cycles,
                            function(x) {
                              try <- fractions(decimal_num,cycles = x,
                                               max.denominator = max.denominator)
                              nom_denom <- strsplit(attr(try,"fracs"),"/")
                              int_denom <- nom_denom[[1]][2]
                              list_return <- list(try,int_denom)
                              }) 
binded_ <- do_not_know_cycles %>% 
  do.call(rbind,.)

cc <- max.denominator - as.numeric(binded_[,2])
indx <- which.min(cc[cc>=0])
out <- do_not_know_cycles[[indx]][1]
out

如前所述,您只需將max_cycles放得足夠大並指定max.denominator ,它將為給定小數帶來最大分母分數。

以下是最大分母的0.723618的輸出:1000000,100000,100

> out
[[1]]
[1] 361809/5e+05

> out
[[1]]
[1] 40265/55644

> out
[[1]]
[1] 55/76

暫無
暫無

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

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