[英]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.denominator
和cycles
這兩個參數在某種程度上決定了分母可以變得多大,但乍一看,這種關系看起來並不是很簡單。
這是僅考慮 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.