Swift 3&4- プロトコルにrounded(_:)
ブループリントされている方法を利用FloatingPoint
する
FloatingPoint
プロトコル(例えばへDouble
とFloat
適合)は青写真rounded(_:)
方法
func rounded(_ rule: FloatingPointRoundingRule) -> Self
FloatingPointRoundingRule
いくつかの異なる丸め規則を列挙する列挙型はどこにありますか:
case awayFromZero
その大きさがソースの大きさ以上である最も近い許容値に丸めます。
case down
ソース以下の最も近い許容値に丸めます。
case toNearestOrAwayFromZero
最も近い許容値に丸めます。2つの値が等しく近い場合は、大きさが大きい方の値が選択されます。
case toNearestOrEven
最も近い許容値に丸めます。2つの値が等しく近い場合は、偶数の値が選択されます。
case towardZero
絶対値がソースの絶対値以下の最も近い許容値に丸めます。
case up
ソース以上の最も近い許容値に丸めます。
@Suragchの優れた回答の例と同様の例を使用して、これらの異なる丸めオプションを実際に示します。
.awayFromZero
絶対値がソースの値以上の最も近い許容値に丸めます。Cの関数間で直接対応するものはありません。これは、それぞれの正の値と負の値に対して、条件に応じてself
、ceil
またはの符号を使用しているfloor
ためself
です。
3.000.rounded(.awayFromZero) // 3.0
3.001.rounded(.awayFromZero) // 4.0
3.999.rounded(.awayFromZero) // 4.0
(-3.000).rounded(.awayFromZero) // -3.0
(-3.001).rounded(.awayFromZero) // -4.0
(-3.999).rounded(.awayFromZero) // -4.0
.down
C floor
関数と同等です。
3.000.rounded(.down) // 3.0
3.001.rounded(.down) // 3.0
3.999.rounded(.down) // 3.0
(-3.000).rounded(.down) // -3.0
(-3.001).rounded(.down) // -4.0
(-3.999).rounded(.down) // -4.0
.toNearestOrAwayFromZero
C round
関数と同等です。
3.000.rounded(.toNearestOrAwayFromZero) // 3.0
3.001.rounded(.toNearestOrAwayFromZero) // 3.0
3.499.rounded(.toNearestOrAwayFromZero) // 3.0
3.500.rounded(.toNearestOrAwayFromZero) // 4.0
3.999.rounded(.toNearestOrAwayFromZero) // 4.0
(-3.000).rounded(.toNearestOrAwayFromZero) // -3.0
(-3.001).rounded(.toNearestOrAwayFromZero) // -3.0
(-3.499).rounded(.toNearestOrAwayFromZero) // -3.0
(-3.500).rounded(.toNearestOrAwayFromZero) // -4.0
(-3.999).rounded(.toNearestOrAwayFromZero) // -4.0
この丸め規則には、ゼロ引数rounded()
メソッドを使用してアクセスすることもできます。
3.000.rounded() // 3.0
// ...
(-3.000).rounded() // -3.0
// ...
.toNearestOrEven
最も近い許容値に丸めます。2つの値が等しく近い場合は、偶数の値が選択されます。C rint
(/と非常に類似nearbyint
)関数と同等です。
3.499.rounded(.toNearestOrEven) // 3.0
3.500.rounded(.toNearestOrEven) // 4.0 (up to even)
3.501.rounded(.toNearestOrEven) // 4.0
4.499.rounded(.toNearestOrEven) // 4.0
4.500.rounded(.toNearestOrEven) // 4.0 (down to even)
4.501.rounded(.toNearestOrEven) // 5.0 (up to nearest)
.towardZero
C trunc
関数と同等です。
3.000.rounded(.towardZero) // 3.0
3.001.rounded(.towardZero) // 3.0
3.999.rounded(.towardZero) // 3.0
(-3.000).rounded(.towardZero) // 3.0
(-3.001).rounded(.towardZero) // 3.0
(-3.999).rounded(.towardZero) // 3.0
丸めの目的は、(例えば、使用して整数値で動作するように準備している場合Int
でFloatPoint
丸めた後の初期化)、我々は単に初期化するという事実を利用するかもしれないInt
使用してDouble
(またはFloat
、小数部分が離れて切り捨てられますなど)。
Int(3.000) // 3
Int(3.001) // 3
Int(3.999) // 3
Int(-3.000) // -3
Int(-3.001) // -3
Int(-3.999) // -3
.up
C ceil
関数と同等です。
3.000.rounded(.up) // 3.0
3.001.rounded(.up) // 4.0
3.999.rounded(.up) // 4.0
(-3.000).rounded(.up) // 3.0
(-3.001).rounded(.up) // 3.0
(-3.999).rounded(.up) // 3.0
補遺:のソースコードにアクセスしFloatingPoint
て、さまざまなFloatingPointRoundingRule
ルールと同等のC関数を検証する
必要にFloatingPoint
応じて、プロトコルのソースコードを見て、パブリックFloatingPointRoundingRule
ルールに相当するC関数を直接確認できます。
より迅速/ STDLIB /公共/コア/ FloatingPoint.swift.gyb我々は、デフォルトの実装ことを確認rounded(_:)
する方法は、変異の私たちを作るround(_:)
方法:
public func rounded(_ rule: FloatingPointRoundingRule) -> Self {
var lhs = self
lhs.round(rule)
return lhs
}
SWIFT / STDLIB /公共/コア/ FloatingPointTypes.swift.gyb我々はデフォルトの実装を見つけround(_:)
、その中での等価性FloatingPointRoundingRule
ルールとC丸め関数は明らかです。
public mutating func round(_ rule: FloatingPointRoundingRule) {
switch rule {
case .toNearestOrAwayFromZero:
_value = Builtin.int_round_FPIEEE${bits}(_value)
case .toNearestOrEven:
_value = Builtin.int_rint_FPIEEE${bits}(_value)
case .towardZero:
_value = Builtin.int_trunc_FPIEEE${bits}(_value)
case .awayFromZero:
if sign == .minus {
_value = Builtin.int_floor_FPIEEE${bits}(_value)
}
else {
_value = Builtin.int_ceil_FPIEEE${bits}(_value)
}
case .up:
_value = Builtin.int_ceil_FPIEEE${bits}(_value)
case .down:
_value = Builtin.int_floor_FPIEEE${bits}(_value)
}
}
pow()
遊び場で、残念ながら利用できません