問題は[低い、-0.0]一定の間隔でそのすべての浮動小数点であるだろう「-0.00」と印刷する。
したがって、あなたが低い見つける必要がある:
- ように印刷(前身(低))=> "-0.01"
- ように印刷(低)=> "-0.00"
その後、あなたは(...離れナン)のようなものを書くことができるようになります
double filter(double x) {
double low = ... ;
return (x < low)
? x
: ((x > 0.0)
? x
: 0.0) ;
}
あなたは正しく丸められprintf関数を持って、そして管理する場合あなたの計算は厳密にIEEE754が適切なコンパイラフラグに準拠するため、lowの正確な値は-1/200に最も近い倍数で-1/200より大きくなります(私は-0.005ではなく1/200を書きます。二重の値ではなく小数点以下の桁数)
sscanf( " - 0.005"、 "%lf"、d)は正しく丸められています。
[-0.005 < (-1/200) and: [-0.005 successor > (-1/200)]] assert.
その後継は(必ずしも、上記のチェックがちょうどフールプルーフれる)-1/200よりも大きい:私はファロSmalltalkの言語に見出さ例えばような正確な演算とすることを確認しました。
したがって、あなたが書くことができます(低< =気づく):
double filter(double x) {
double low = 0.005 ;
return (x <= low)
? x
: ((x > 0.0)
? x
: 0.0) ;
}
'のstd :: signbit'が役立つはずです。 – Florian
ちょうどそれを丸めるのはなぜですか? –
出力のチェックはどうなるのですか? '出力(出力==" -0.00 ")出力=" 0.00 ";'(出力はstd :: stringと仮定します) –