> > #include <stdio.h>
> > #include "openssl/bio.h"
> >
> >
> > int main(int argc, char* argv[])
> > {
> > BIO *myBio = BIO_new_fp(stdout, 0);
> > BIO_printf(myBio, "float: %.1f\n", (float) 1000.1234);
> > return 0;
> > }
> >
> >
> > When I run this against either of our builds of 0.9.7c (or b) on HP-UX
> > (PA and IA) the output of the above program will be "float: 000.1"
> > Note
> > that the front part of the whole value is cut off.
> >
> > This does not occur on Linux.
>
> That is not correct, it does also occur on my Linux box.
I can't reproduce it on my Linux box...
> Anyway, the problem is not with OpenSSL but with your code. When
> performing printf() (variable argument list functions without a
> protototype to specify the particular data type), a float value will be
> promoted to a double and the printf formatting functions therefore
> expect a double value (8 byte) to be available. By casting your data
> explicitly to (float), only a 4 bit value is passed that is
> misinterpreted by the %f printing routine.
The last statement is false. ANSI C behaviour is to promote floats to
doubles whenever in doubt. Given that BIO_printf is declared with ...,
ellipsis, (float)1000.1234 should be compiled as
(double)(float)1000.1234. Moreover, you can actually see that it *is*
compiled as (double)(float)1000.1234, because otherwise printout
wouldn't be 000.1, but a garbage value. No, I don't have explanation for
the phenomena, but I can't find the presented analysis conclusive:-) A.
______________________________________________________________________
OpenSSL Project http://www.openssl.org
Development Mailing List [EMAIL PROTECTED]
Automated List Manager [EMAIL PROTECTED]