Skip to content

Commit e4f9de2

Browse files
authored
Merge pull request rurema#3302 from scivola/improve-Float-methods
Float#<=>, to_r, to_s を改善
2 parents 5a19604 + 108aaa0 commit e4f9de2

1 file changed

Lines changed: 46 additions & 10 deletions

File tree

manual/api/_builtin/Float.md

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -104,16 +104,35 @@ p 0.0 ** 0 # => 1.0
104104

105105
### def <=>(other) -> -1 | 0 | 1 | nil
106106

107-
`self` `other` を比較して`self` が大きい時に正
108-
等しい時に `0`小さい時に負の整数を返します
107+
`self` `other` と比較し`self` のほうが大きい場合に `1`
108+
等しい場合に `0`小さい場合に `-1` を返します
109109
比較できない場合は `nil` を返します
110110

111-
```ruby title="例"
112-
p 3.05 <=> 3.14 # => -1
113-
p 1.732 <=> 1.414 # => 1
111+
返り値を覚えるには、`<=>``-` に置き換えてみるとよいでしょう。`x <=> y``x - y` は符号が一致します。
112+
113+
```ruby title="比較できる例"
114+
p 3.05 <=> 3.14 # => -1
115+
p 1.732 <=> 1.414 # => 1
114116
p 3.3 - 3.3 <=> 0.0 # => 0
115-
p 3.14 <=> "hoge" # => nil
117+
118+
# 正負の無限大も比較できる
119+
p 3.14 <=> Float::INFINITY # => -1
120+
p 3.14 <=> -Float::INFINITY # => 1
121+
p Float::INFINITY <=> -Float::INFINITY # => 1
122+
123+
# Complex オブジェクトでも虚部がゼロなら比較できる
124+
p 3.14 <=> 3.1+0i # => 1
125+
```
126+
127+
```ruby title="比較できない例"
128+
# NaN とは比較できない
116129
p 3.14 <=> 0.0/0.0 # => nil
130+
131+
# 虚部がゼロでない複素数とは比較できない
132+
p 3.14 <=> 1i # => nil
133+
134+
# 数値でないものは Float と比較できない
135+
p 3.14 <=> "3.1" # => nil
117136
```
118137

119138
### def ==(other) -> bool
@@ -486,8 +505,7 @@ p 0.1.negative? # => false
486505

487506
`self` を人間が読みやすい形の文字列表現にして返します。
488507

489-
固定小数点、浮動小数点の形式か、 `"Infinity"``"-Infinity"``"NaN"` のいず
490-
れかを返します。
508+
10進固定小数点、10進浮動小数点の形式か、`"Infinity"``"-Infinity"``"NaN"` のいずれかを返します。
491509

492510
- **return** -- 文字列を返します。
493511

@@ -500,6 +518,10 @@ p (1.0/0.0).to_s # => "Infinity"
500518
p (0.0/0.0).to_s # => "NaN"
501519
```
502520

521+
`0.1.to_s` が文字列 `"0.1"` を返すのは自明ではありません。
522+
数値リテラル `0.1` によって生成される Float オブジェクトは、数学的には 0.1 からわずかにずれた値であり、厳密な小数表示は循環小数になります。
523+
それに対し、`Float#to_s` は Float が持つ精度に見合った穏当な文字列表現を返します。
524+
503525
### def arg -> 0 | Float
504526
### def angle -> 0 | Float
505527
### def phase -> 0 | Float
@@ -541,10 +563,24 @@ p 0.5.numerator # => 1
541563

542564
### def to_r -> Rational
543565

544-
`self`[c:Rational] に変換します。
566+
`self`[c:Rational] オブジェクトに変換したものを返します。
567+
568+
浮動小数点数は、`Float::INFINITY`, `-Float::INFINITY`, `Float::NAN` を除けば数学的には有理数を表しています。その値を得るメソッドです。
569+
570+
- **raise** `FloatDomainError` -- `self``Float::INFINITY`, `-Float::INFINITY`, `Float::NAN` の場合に発生します。
545571

546572
```ruby title="例"
547-
p 0.5.to_r # => (1/2)
573+
p 0.0.to_r # => (0/1)
574+
p 0.75.to_r # => (3/4)
575+
```
576+
577+
```ruby title="リテラルで得られるFloatの厳密値を知る例"
578+
p 0.1.to_r # => (3602879701896397/36028797018963968)
579+
p 0.1r # => (1/10)
580+
# 浮動小数点数リテラル `0.1` によって生成される Float オブジェクトは
581+
# 数学的には 0.1 とはわずかに異なる数を表しており、
582+
# 有理数リテラル `0.1r` で生成される Rational オブジェクトとは
583+
# 値が一致しない
548584
```
549585

550586
- **SEE** [m:Float#rationalize]

0 commit comments

Comments
 (0)