Il problema è che ogni virgola mobile in un certo intervallo [basso, -0,0] sarà essere stampato "-0,00".
Quindi devi trovare basso:
- tale che la stampa (predecessore (basso)) => "-0.01"
- tale che la stampa (basso) => "-0.00"
Poi, sarete in grado di scrivere qualcosa di simile (nan a parte ...)
double filter(double x) {
double low = ... ;
return (x < low)
? x
: ((x > 0.0)
? x
: 0.0) ;
}
Se si dispone di un printf correttamente arrotondato, e gestire la tua aritmetica deve essere rigorosamente conforme allo standard IEEE754 con i flag appropriati del compilatore, il valore esatto di basso è il doppio più vicino a -1/200, maggiore di -1/200 (scrivo 1/200 piuttosto che -0.005 perché sto parlando del valore decimale, non il doppio)
Quello che abbiamo con sscanf arrotondato correttamente ("- 0.005", "% lf", d): il doppio risultato è inferiore a -1/200. Ho fatto controllare che con l'aritmetica esatta come per esempio si trovano in Pharo linguaggio Smalltalk:
[-0.005 < (-1/200) and: [-0.005 successor > (-1/200)]] assert.
Il suo successore è maggiore di -1/200 (necessariamente, al di sopra di controllo è solo foolproofing).
Così si può scrivere (notare la < = basso):
double filter(double x) {
double low = 0.005 ;
return (x <= low)
? x
: ((x > 0.0)
? x
: 0.0) ;
}
fonte
2016-01-20 18:23:56
'std :: signbit' dovrebbe aiutare. – Florian
Perché non basta intorno ad esso? –
Per quanto riguarda il controllo dell'output: 'if (output ==" -0.00 ") output =" 0.00 ";' (supponendo che l'output sia uno std :: string) –