2013-10-07 4 views
6

私はこれを全く理解できません。ここでの問題は何ですか?XCTestCaseでCGFloatを比較するには?

私は1.0,1.0f,(CGFloat) 1.0および(CGFloat)(2.0 - 1.0)と入力してみました。毎回同じエラーが発生します。

Screenshot from xcode

答えて

17

私は、このためにFLT_EPSILON使用することをお勧めします:あなたは大きなイプシロンを必要とするためにいくつかの理由がない限り

XCTAssertEqualWithAccuracy(mov.lastDelta, 0.0f, FLT_EPSILON, @"");

を。

0

は私が

mov.value = 8.9 
XCTAssertEqualWithAccuracy(mov.lastDelta, 0.0f, 0.001, @""); 

に変更し、

5

あなたの数字、0.9の端数部分は、フロートによって正確に表現することができない...今だけ正常に動作するようです。 何らかの丸め処理が行われますが、これが原因です。 (1/2)+(1/4)+(1/8)+(1/64)+(1/128)+(1/1024)+(1/2048)+(1 + 128)/16384)+(1/32768)+(1/262144)等= 0,8999978005等

人間の目に見える部分は、バイナリシステムでは丸められないことがある。

0.5は、cpu =(1/2)の丸数字です。

0.75は、cpu =(1/2)+(1/4)のラウンドです。

でも0,9072265625が丸い((1/2)+(1/4)+(1/8)+(1/32)+(1/1024))

ではなく、0.9または0.1 。 0.2でもない:

EDIT:もちろん、フロートの比較にはイプシロンを使用します。