Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。
Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています
Q&A
解決済
2回答
2210閲覧
総合スコア60
0グッド
1クリップ
投稿2018/06/22 05:39
0
1
swift1let actual:Float = 0.01*10 2let expected:Float = 0.1 3 4XCTAssert(actual == expected) 5 6
swift
1let actual:Float = 0.01*10 2let expected:Float = 0.1 3 4XCTAssert(actual == expected) 5 6
手計算だとactualは0.1になります。 しかし、xcode上でデバックをすると0.0999999994となってしまいテストが失敗してしまいます。 なぜでしょうか? また具体的な対策はどのようにすると良いでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
質問へのコメント
回答2件
Swiftに限りませんが、浮動小数点のイコールチェックにはEPSILONを使います。 計算機イプシロン
SwiftではulpOfOneを使います。(以前は、FLT_EPSILONやDBL_EPSILONを使っていました)
swift1abs(actual.distance(to: expected)) < .ulpOfOne
1abs(actual.distance(to: expected)) < .ulpOfOne
「差がイプシロン未満なら等しいとみなす」ということです。
distance(to:)は絶対値だと思っていたら違ってました。abs()で囲って下さい。 素直にabs(actual - expected)でいいかも。
abs()
abs(actual - expected)
投稿2018/06/22 06:13
総合スコア16733
回答へのコメント
2018/06/22 07:24
2018/06/22 07:59
2018/06/22 09:33
ベストアンサー
「浮動小数点 桁落ち」でぐぐってみてください。
ご存知のように、コンピュータの世界では2進数で表現されます これが整数であれば問題はないんですが、少数点の世界になると、10進数の世界から見るとズレが出て来てしまいます。
早い話が、2進数では、0.01 という数値は表現できません
以上を踏まえ、なにをもって対策、とするのかを決める必要があります
投稿2018/06/22 05:59
総合スコア88186
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
15分調べてもわからないことはteratailで質問しよう!
ただいまの回答率85.29%
質問をまとめることで思考を整理して素早く解決
テンプレート機能で簡単に質問をまとめる
swift float型のテスト
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/22 07:24
2018/06/22 07:59
2018/06/22 09:33