2015-12-20 124 views
1

我在嘗試仙丹,而且這個問題出現了 - 我似乎無法創建一系列浮點數作爲邊界。浮點數的範圍

按照戴夫·托馬斯的書,第24頁:

Ranges are represented as start..end, where start and end can be any type...

然而,當我嘗試使用浮點數來創建範圍,我得到一個錯誤:

iex(1)> 1.1..3.1 
** (ArgumentError) ranges (left .. right) expect both sides to be integers, got: 1.1 .. 3.1 
    (elixir) expanding macro: Kernel.../2 
      iex:1: (file) 

我想有圍繞此工作:

iex(2)> a = 1.1 
1.1 
iex(3)> b = 3.1 
3.1 
iex(4)> a..b 
1.1..3.1 

但是,在後面的情況下,in運算符無法ret甕值我直覺地預期:

iex(5)> 2.0 in a..b 
false 

我很明顯在這裏丟失了一些東西。有人能指出我正確的方向嗎?

更新。分配c = a..b不能解決問題:

$ iex 
Erlang/OTP 18 [erts-7.2] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace] 

Interactive Elixir (1.1.1) - press Ctrl+C to exit (type h() ENTER for help) 
iex(1)> a = 1.1 
1.1 
iex(2)> b = 3.1 
3.1 
iex(3)> c = a..b 
1.1..3.1 
iex(4)> 2.0 in c 
false 

更新2。看起來我可以使用a,bc構建一個範圍,如上所示(它不再被認爲是合法的?),但是從1.1開始可以使用not using macro

這給我留下了這樣的疑問:

什麼是默認選擇,在製造了一系列浮點數的這樣,如果它涵蓋了給定數量,我可以檢查?

+0

它適用於我(Elixir(1.0.4)) - 您的代碼的所有版本 –

+1

考慮你要求的。該範圍有一個隱含的步驟1.如果你給它一個開始和結束,它不能分開地用1的步驟分開覆蓋會發生什麼?警告?錯誤?您似乎也認爲範圍應該是連續的。我得到的印象是,它實際上更多的是一組離散值。這不是從s到e的連續範圍,而是更像[s,s + 1,s + 2。 。 。 e-2,e-1,e]。所以即使我的範圍是1..3,如果我問2.5是否在範圍內,它將返回false。或者使用你的例子,我希望c中的2.1是真的,但不是2.0。 –

+1

@OnorioCatenacci你是對的。我誤將範圍視爲連續的東西。我只是這樣,因爲名字暗示了這一點。如果實現不是連續的,我現在理解這種情況 - 只需手動檢查邊界即可實現我需要的實現,例如, 'a <2.0&2.0 gmile

回答

2

我有藥劑1.0.4,在那裏我可以檢查像1.2 in a..b

由於您使用的是Elixir 1.1.1,因此Elixir 1.1可能添加了一個不允許非整數範圍的檢查。

此問題Fix ranges to only accept integers as first and last elements提供了詳細信息。

+0

謝謝,我只是做了這個(分配給'c'),我的代碼返回'false'。我基本上只是運行你的代碼,並在iex(4)上獲得'false'而不是'true'。任何想法發生了什麼? – gmile

+0

我意識到......你的代碼對於我來說沒有父母。 –

+0

感謝魔杖製造商。我也是這樣挖的。由於最初的問題(例如,如何創建一系列浮點數以便我可以檢查它是否覆蓋給定的數字),我對這個問題進行了更新並將其保留開放,這些問題仍未解決。 – gmile