2011-01-20 11 views
4

定義により、整数除算は商を返します。整数除算

なぜ4613.9145 div 100.がエラー(「不良引数」)ですか?

答えて

13

divの場合、引数は整数である必要があります。 /は、引数として任意の数値、特に浮動小数点数を受け入れます。だからあなたたとえば、次のように動作します:

1> 4613.9145/100. 
46.139145 

を、違いを対比してみてくださいするには:

2> 10/10. 
1.0 

3> 10 div 10. 
1 

ドキュメント:http://www.erlang.org/doc/reference_manual/expressions.html


更新:Integer divisionは、時々、\をすることができ表記しました

a \ b = floor(a/b) 

標準のlibにないfloor関数が必要です。

% intdiv.erl 
-module(intdiv). 
-export([floor/1, idiv/2]). 

floor(X) when X < 0 -> 
    T = trunc(X), 
    case X - T == 0 of 
     true -> T; 
     false -> T - 1 
    end; 

floor(X) -> 
    trunc(X) . 

idiv(A, B) -> 
    floor(A/B) . 

使用法: "定義"

$ erl 
... 
Eshell V5.7.5 (abort with ^G) 
> c(intdiv). 
{ok,intdiv} 
> intdiv:idiv(4613.9145, 100). 
46 
+0

私は同意しません。結果は46で、46.139145ではありません。 div =整数除算、/ =浮動小数点除算 – Bertaud

+0

あなたが提案したものは、それは非論理的です。trunc(N/100)は結果を返します。 div関数は、整数除算の定義を尊重していないようです。 – Bertaud

+1

@Bertaud:申し訳ありませんが、ここで何かを混同するつもりはありませんでした。しかし、その後、あなたの質問を言い換えるようにしてください。そうすれば答えがより明確になります。 float/intの除算、丸められた部分、床、天井の整数部分を求めますか?オペレーションへの引数は特定の型でなければならず、あなたの例では、それが満たされていないので、引数の誤りが間違っています。 – miku

1

私にはわからない、非常にあなたが何を意味しますか言語設計者は自由にオペレータを定義することができます。 Erlangでは、整数引数だけを受け入れるようにdivを定義しています。

Erlangのクリエイターが知りたいと思っている設計上の決定であれば、それらを電子メールで送信できます。また、あなたが(非常に短い)文法を吟味するのに不思議であれば、それはhereです。幸運!

+0

はい、いいえ。もう一度http://mathworld.wolfram.com/IntegerDivision.htmlを読んでください。もちろん、式(1 == 1)をfalseとして定義することはできますが、そのすべての人には問題があります。 – Bertaud

+0

そのリンクのaとbの型は定義されていません。私は、整数を使用し、aとbが整数である分数として中間結果を表現する例が強く示唆していると思います。 – cthulahoops

5

Erlangの整数除算divは、入力として2つの整数を取り、整数を返すように定義されています。以前のコメントhttp://mathworld.wolfram.com/IntegerDivision.htmlで与えたリンクは、その例では整数しか使用していないので、この議論ではあまり役に立ちません。 truncroundを使用すると、任意の引数を使用できます。

0

あなたが探しているものは、@Bertaudです。 Erlangのdivは、他の場所での定義方法にかかわらず、整数でしか動作しません。

trunc(4613.9145) div 100. 

またはあなたの代わりにdiv/を使用し、その後整数に商を変換することができます:あなたはdivを呼び出す前に、整数の引数を変換することができ

trunc(4613.9145/100). 

そしてtruncがまたは何をしてもしなくてもよいですround、床または天井(Erlangの標準ライブラリでは定義されていませんが、mikuが上記のfloorで行ったように自分自身を定義することは難しくありません)が必要です。これはErlangが何かを仮定せず、あなたのために変換を行う理由の一部です。しかし、いずれの場合でも、Erlangの2つの非整数の整数商が必要な場合は、何らかの明示的な変換ステップをどこかに持たなければなりません。