[#49804] Re: 小数点以下の表示で質問があります。 — Fumiaki Sakamoto <ght8270407fs@...>

自己レスですみません。

14 messages 2014/04/23
[#49805] Re: 小数点以下の表示で質問があります。 — "KISHIMOTO, Makoto" <ksmakoto@...4u.or.jp> 2014/04/23

きしもとです

[#49806] Re: 小数点以下の表示で質問があります。 — Fumiaki Sakamoto <ght8270407fs@...> 2014/04/23

きしもとさま

[#49808] Re: 小数点以下の表示で質問があります。 — Tetsuo Sakaguchi <saka@...> 2014/04/23

阪口です。

[ruby-list:49799] Re: Range class?

From: Yukihiro Matsumoto <matz@...>
Date: 2014-04-20 16:09:00 UTC
List: ruby-list #49799
まつもと ゆきひろです

原則は先ほどのメールで説明した通りなのですが、内部的には数値、
特に整数と浮動小数点数は特別扱いしており、その辺に不徹底があ
るようです。たとえば、ご指摘のRationalとFloatの挙動の違いはそ
れが原因です。これはRational対応を行うべきですね。

また、minmaxについても、ほかのメソッド同様の数値対応をするか、
ドキュメントに明記するかどちらかを行うべきでしょう。

In message "Re: [ruby-list:49798] Re: Range class?"
    on Mon, 21 Apr 2014 00:52:06 +0900 (JST), "Masa" <imagine@sakano.co.uk> writes:
|
|まつもとさま、皆様
|
|坂野正明です。
|
|まつもとさん、早速のそして大変明快なご返事を
|ありがとうございました!
|お蔭様で多くの疑問が解けました!
|
|一点、Range の要素が Rational と Floatで違いがでるのが
|まだ分かりませんが……(後述します)。
|以下、それぞれご返事を書きます。
|
|2014年 4月 20日(日)10:58 pm に Yukihiro Matsumoto さんは書きました:
|> まつもと ゆきひろです
|>
|> Rangeの奇妙な振る舞いを理解するためには、Rangeのメソッドには、
|> Enumerableとして振る舞うものと、Intervalとして振る舞うものの
|> の両方があることに注意しなければなりません。
|>
|> Enumerableとして振る舞うものは離散的で、eachメソッドが生成す
|> る要素を使います。Rangeの場合、eachは始点から1.0ずつ離れた値
|> が生成されます(数値の場合)。
|
|そうだったのですか!
|始点から 1.0 (Float?)というステップだったとは
|存じませんでした。
|
|たとえば、
|
|irb> (1.0..5).each {|n| print n, ' ' }
|TypeError: can't iterate from Float
|	from (irb):30:in `each'
|
|というように、始点が Float であればそもそも
|Exception が発生します。
|だから、例外無しに succ() が使われていると
|思い込んでいたものでした……。
|
|# 内部の実装として、数値の場合は数値計算した方が
|# 速いだろうとは(言われてみれば)想像できますが。
|
|> Intervalとして振る舞うものは連続的で始点(begin)と終点(end)の
|> 大きさで決まります。
|>
|> たとえば、include?はeachを使い、cover?は始点と終点の間の比較
|> で判定します。
|
|はい、分かります。
|first と begin との違いも同様ですよね。その場合は
|数値を例外として。
|
|> ですから、ご指摘のメソッドではこのような事情があります。
|>
|> maxは終点を、minmaxは最終要素を返します。
|> sizeはeachの与える要素数を返します。
|>
|> 例として「0.5...5」は「0.5から1.0刻みで5.0を越えない要素の数」
|> という意味になり、それらの要素は[0.5, 1.5, 2.5, 3.5, 4.5]です
|> から「(0.5...5).size」は5になります。
|>
|> 理解(or 納得)の一助になりましたでしょうか?
|
|明快です。
|ありがとうございました。
|四捨五入か何かと疑うことになったのは、偶然、私が
|使った例の始点が 1.5 という値だったからというだけですね。
|参りました。
|
|一点だけ、まだそれでは説明できないのは、以下の例です。
|
|| irb> (Rational(1,2)...5).size  # => 4
|| irb> (0.5...5).size  # => 5  # Why not 4??
|
|Rational の方が(だけ?)整数化されているように、
|もしくはそれを下回らない最小の整数になっているような
|挙動ですね。
|
|
|上の違い、特に max/minmax の方は、マニュアルに書かれて
|あれば親切かも知れませんね。
|# 現実的に問題になることは相当稀でしょうが……。
|include?/cover? や first/begin と違って(←これらは、
|最初に理解した時に、命名の見事さに感動したものでした!
|短い名にして体をよく表している、と)、挙動に違いがある
|ことが予想あるいは理解しにくいと恐れますもので。
|
|坂野正明

In This Thread