473,396 Members | 2,018 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,396 software developers and data experts.

printf question, leading zero in E format?

Whatever format I try in Printf, an 'E' format number nearly always
has a leading non-zero:-

1.2345E7

-9.3456E8 etc.

Is it possible to force it (printf) always to have leading zero?

Thus, the above becomes:-

0.12345E8

-0.93456E9

Jun 7 '07 #1
4 3194
bobm2005 <bo*******@postmaster.co.ukwrites:
Whatever format I try in Printf, an 'E' format number nearly always
has a leading non-zero:-

1.2345E7

-9.3456E8 etc.

Is it possible to force it (printf) always to have leading zero?
No. The fprintf specification says this:

e,E A double argument representing a floating-point number is
converted in the style [-]d.ddd e±dd, where there
is one digit (which is nonzero if the argument is
nonzero) before the decimal-point character and the
number of digits after it is equal to the precision [...]

So the digit before the decimal point is always nonzero if the
number to format is nonzero.
--
Comp-sci PhD expected before end of 2007
Seeking industrial or academic position *outside California* in 2008
Jun 7 '07 #2
On Thu, 07 Jun 2007 10:36:50 -0700 (while OU was sucking), bobm2005
wrote:
>Whatever format I try in Printf, an 'E' format number nearly always
has a leading non-zero:-

1.2345E7

-9.3456E8 etc.

Is it possible to force it (printf) always to have leading zero?

Thus, the above becomes:-

0.12345E8

-0.93456E9
Someone already said no to your question.

What I was going to recommend is that you could write your own. I
wrote my own for some embedded work I was doing (standard SPRINTF is a
memory/code hog). Here is the function, it could be modified to print
the numbers between 0 and 1 instead of 1 to 10.

RonB

// value = value to be printed
// total number of spaces to be occupied
// the z in "%zE"
void outputExp(float value, char total)
{ // # of digits to be printed AFTER decimal point
#define POST_DEC 6

// leading spaces of the
while(total 12){
out_putchar(' ');
--total;
}
total = 0;

// FIRST PRINT SIGN
if((*((char*)&value) & 0x80) == 0x80)
out_putchar('-');
else
out_putchar(' ');
*((char*)&value) &= 0x7F;

// ZERO CASE
if(value == 0)
out_putString("0.000000E+00");
else{
// NUMBER HAS A POSITVE EXPONENT
TF_3 = value;
if(value >= 10){
while(TF_3 >= 10){
TF_3 /= 10;
++total;
}
}
// NUMBER HAS A NEGATIVE EXPONENT
else if(value < 1){
while(TF_3 < 1){
TF_3 *= 10;
++total;
}
total = -total;
}

// TURN NUMBER INTO 7 DIGIT LONG
{
char i= 8-total;
TF_3 = 1;
if(i >= 10){
value *= 1e9;
i -= 9;
}
for(i; i 0; --i)
TF_3 *= 10;
value *= TF_3;
}
// PRINT CHAR BY CHAR
{
xdata long print = value + 5; // ROUNDING
xdata long div = 100000000;
while(div 10){
char ch = print / div;
out_putchar(ch + '0'); //CHAR PRINTER
if(div == 100000000)
out_putchar('.');
print -= (div * ch);
div /= 10;
}
out_putchar('E');
if(total < 0){
out_putchar('-');
total = -total;
}
else
out_putchar('+');
outputInt(total, 2, 1);
// this is my own Integer printer
}
}
}
Jun 7 '07 #3
On Jun 8, 6:59 am, Ron Blancarte
void outputExp(float value, char total)
{
if((*((char*)&value) & 0x80) == 0x80)
out_putchar('-');
else
out_putchar(' ');
*((char*)&value) &= 0x7F;
What possessed you to write that monstrosity
instead of:
if ( value < 0 )
{
out_putchar('-');
value = -value;
}
else
out.putchar(' ');

BTW what is the purpose of "== 0x80" ? What else
could it equal besides that and 0?

Jun 7 '07 #4
On Thu, 07 Jun 2007 13:59:06 -0500, Ron Blancarte
<ron@---TAKETHISOUT---.blancarte.comwrote:
>On Thu, 07 Jun 2007 10:36:50 -0700 (while OU was sucking), bobm2005
wrote:
>>Whatever format I try in Printf, an 'E' format number nearly always
has a leading non-zero:-

1.2345E7

-9.3456E8 etc.

Is it possible to force it (printf) always to have leading zero?

Thus, the above becomes:-

0.12345E8

-0.93456E9

Someone already said no to your question.

What I was going to recommend is that you could write your own. I
wrote my own for some embedded work I was doing (standard SPRINTF is a
memory/code hog). Here is the function, it could be modified to print
the numbers between 0 and 1 instead of 1 to 10.

RonB

// value = value to be printed
// total number of spaces to be occupied
// the z in "%zE"
void outputExp(float value, char total)
{ // # of digits to be printed AFTER decimal point
#define POST_DEC 6

// leading spaces of the
while(total 12){
out_putchar(' ');
Where is this function defined? Does it do something the standard
putchar() won't?
> --total;
}
total = 0;

// FIRST PRINT SIGN
if((*((char*)&value) & 0x80) == 0x80)
out_putchar('-');
else
out_putchar(' ');
*((char*)&value) &= 0x7F;
Why make the code dependent on some particular floating point
representation? You can compare value to 0.0 and run from there.
>
// ZERO CASE
if(value == 0)
out_putString("0.000000E+00");
else{
// NUMBER HAS A POSITVE EXPONENT
TF_3 = value;
Where is TF_3 defined?
> if(value >= 10){
while(TF_3 >= 10){
TF_3 /= 10;
++total;
}
}
// NUMBER HAS A NEGATIVE EXPONENT
else if(value < 1){
while(TF_3 < 1){
TF_3 *= 10;
++total;
}
total = -total;
}

// TURN NUMBER INTO 7 DIGIT LONG
{
char i= 8-total;
TF_3 = 1;
if(i >= 10){
value *= 1e9;
i -= 9;
}
for(i; i 0; --i)
TF_3 *= 10;
value *= TF_3;
}
// PRINT CHAR BY CHAR
{
xdata long print = value + 5; // ROUNDING
xdata long div = 100000000;
while(div 10){
char ch = print / div;
out_putchar(ch + '0'); //CHAR PRINTER
if(div == 100000000)
out_putchar('.');
print -= (div * ch);
div /= 10;
}
out_putchar('E');
if(total < 0){
out_putchar('-');
total = -total;
}
else
out_putchar('+');
outputInt(total, 2, 1);
// this is my own Integer printer
}
}
}

Remove del for email
Jun 8 '07 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

5
by: OneDay | last post by:
I've got a field that has some old data with text in it, but all forward data will be a 3 digit number. But many of the numbers are still only 2 digits. I would like to force the leading zero in...
8
by: Johan Lindh | last post by:
Where can I find a comprehensive test suite for printf()? It seems like most implementations go wrong at sensitive spots, like printf("#.0o",0) (which should print "0") printing nothing at all. ...
7
by: sunfiresg | last post by:
During an interview, I am asked to answer a question: Printf is a major formatted output function provided by the standard C library. Printf accepts a formatting string followed by a various...
13
by: pb | last post by:
Im wanted to pad out blank spaces with a specific character instead of spaces or zeros, does C support that? printf("$%*d", '*', 5); // Not sure what the format string is supposed to look like...
7
by: teachtiro | last post by:
Hi, 'C' says \ is the escape character to be used when characters are to be interpreted in an uncommon sense, e.g. \t usage in printf(), but for printing % through printf(), i have read that %%...
5
by: Bilgehan.Balban | last post by:
Hi, I use %#08x to print unsigned integers in hexadecimal format. According to C ref. man. Harbison & Steele, #08 stands for "pad the number with up to 8 zeroes to complete it to 8 digit...
5
by: GarryJones | last post by:
I have code numbers in 2 fields from a table which correspond to month and date. (Month, Code number) Field name = ml_mna 1 2 3 etc up to 12 (Data is entered without a leading zero)
6
by: JimmyKoolPantz | last post by:
Task: Customer wants a script of the data that was processed in a "CSV" file. Problem: Zip-Code leading zeros are dropped Basically we have a client that has requested a custom script for...
43
by: Jrdman | last post by:
someone has an idea on how the printf function is programmed ?
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.