473,386 Members | 1,694 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,386 software developers and data experts.

Sensibly printed floats?

Hi all,

I'm used to ANSI Common Lisp implementations sanely printing single and
double floats. By sane I mean the printed decimal representation mimics
the underlying binary precision of the float. For example:

[1]> (coerce 2/3 'single-float)
0.6666667
[2]> (coerce 2/300 'single-float)
0.006666667
[3]> (coerce 2/3 'double-float)
0.6666666666666666d0
[4]> (coerce 2/300 'double-float)
0.006666666666666667d0
[5]> (coerce 2/30000 'double-float)
6.666666666666667d-5

Does C99 provide a method to print floats this way (apart from `f', `d'
etc. exponential markers)?

Regards,
Adam
Nov 14 '05 #1
4 1779
Adam Warner wrote:
Hi all,

I'm used to ANSI Common Lisp implementations sanely printing single and
double floats. By sane I mean the printed decimal representation mimics
the underlying binary precision of the float. For example:

[1]> (coerce 2/3 'single-float)
0.6666667
[2]> (coerce 2/300 'single-float)
0.006666667
[3]> (coerce 2/3 'double-float)
0.6666666666666666d0
[4]> (coerce 2/300 'double-float)
0.006666666666666667d0
[5]> (coerce 2/30000 'double-float)
6.666666666666667d-5

Does C99 provide a method to print floats this way (apart from `f', `d'
etc. exponential markers)?


I'm not entirely sure I understand what you mean by
"this way," but perhaps the "%g" conversion specifier is
what you're looking for.

--
Er*********@sun.com
Nov 14 '05 #2
"Adam Warner" <us****@consulting.net.nz> wrote

I'm used to ANSI Common Lisp implementations sanely printing single and
double floats. By sane I mean the printed decimal representation mimics
the underlying binary precision of the float. For example:

[1]> (coerce 2/3 'single-float)
0.6666667
[2]> (coerce 2/300 'single-float)
0.006666667
[3]> (coerce 2/3 'double-float)
0.6666666666666666d0
[4]> (coerce 2/300 'double-float)
0.006666666666666667d0
[5]> (coerce 2/30000 'double-float)
6.666666666666667d-5

Does C99 provide a method to print floats this way (apart from `f', `d'
etc. exponential markers)?

The %g and %f flags take "width" and "precision" markers.

To print a float for human consumption, just use a bare %g. To print out for
machine accuracy, use %*g and pass DBL_DIG as the specifier. This will allow
you to convert between text and binary and back with no loss of precision.

To print in tables, mess about with the width specifier and %f. As a last
resort you can write your own formatting routine, but you shouldn't have to
do this for general-purpose programming.
Nov 14 '05 #3
Adam Warner wrote:
Hi all,

I'm used to ANSI Common Lisp implementations sanely printing single and
double floats. By sane I mean the printed decimal representation mimics
the underlying binary precision of the float. For example:

[1]> (coerce 2/3 'single-float)
0.6666667
[2]> (coerce 2/300 'single-float)
0.006666667
[3]> (coerce 2/3 'double-float)
0.6666666666666666d0
[4]> (coerce 2/300 'double-float)
0.006666666666666667d0
[5]> (coerce 2/30000 'double-float)
6.666666666666667d-5

Does C99 provide a method to print floats this way (apart from `f', `d'
etc. exponential markers)?


Not just C99, but earlier versions of C as well:

#include <stdio.h>
#include <float.h>

int main(void)
{
printf("2/3 single-float: %.*g\n", FLT_DIG, 2.f / 3.f);
printf("2/300 single-float: %.*g\n", FLT_DIG, 2.f / 300.f);
printf("2/3 double-float: %.*g\n", DBL_DIG, 2. / 3.);
printf("2/300 double-float: %.*g\n", DBL_DIG, 2. / 300.);
printf("2/30000 double-float: %.*g\n", DBL_DIG, 2. / 30000.);
return 0;
}

2/3 single-float: 0.666667
2/300 single-float: 0.00666667
2/3 double-float: 0.666666666666667
2/300 double-float: 0.00666666666666667
2/30000 double-float: 6.66666666666667e-05
Nov 14 '05 #4
Hi Martin Ambuhl,
On Sat, 08 Jan 2005 14:10:48 -0500, Martin Ambuhl wrote:
Does C99 provide a method to print floats this way (apart from `f', `d'
etc. exponential markers)?


Not just C99, but earlier versions of C as well:

#include <stdio.h>
#include <float.h>

int main(void)
{
printf("2/3 single-float: %.*g\n", FLT_DIG, 2.f / 3.f);
printf("2/300 single-float: %.*g\n", FLT_DIG, 2.f / 300.f);
printf("2/3 double-float: %.*g\n", DBL_DIG, 2. / 3.);
printf("2/300 double-float: %.*g\n", DBL_DIG, 2. / 300.);
printf("2/30000 double-float: %.*g\n", DBL_DIG, 2. / 30000.);
return 0;
}

2/3 single-float: 0.666667
2/300 single-float: 0.00666667
2/3 double-float: 0.666666666666667
2/300 double-float: 0.00666666666666667
2/30000 double-float: 6.66666666666667e-05


Thanks everyone! Coupled with the # modifier (so e.g. 666667.f prints as
666667. instead of 666667) it should always be possible to dynamically
distinguish a printed float from an integer.

Regards,
Adam
Nov 14 '05 #5

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

Similar topics

8
by: Tom | last post by:
Has anyone ever seen a IComparer for floats the returns magnitude. i.e. instead of returning -1, it would return -5. To let you know HOW different the two numbers are. obviously for int it is a -...
8
by: Madhusudan Singh | last post by:
Is it possible to convert a very long list of strings to a list of floats in a single statement ? I have tried float(x) and float(x) but neither work. I guess I would have to write a loop if...
3
by: freelanceinaz | last post by:
My problem page is at http://girlschorus.org/test.html I have a container with a relatively positioned graphic at the top, then two floats which are relatively positioned (for a a two-column...
11
by: Steve | last post by:
I'm trying to create a list range of floats and running into problems. I've been trying something like: a = 0.0 b = 10.0 flts = range(a, b) fltlst.append(flts)
13
by: yb | last post by:
Hi, Is there a CSS method to clear a float such that it aligns with the left content edge. For example: X X X X X X X X
9
by: Thomas Nelson | last post by:
I want to generate all the fractions between 1 and limit (with limit>1) in an orderly fashion, without duplicates. def all_ratios(limit): s = set() hi = 1.0 lo = 1.0 while True: if hi/lo not...
16
by: luca bertini | last post by:
Hi, i have strings which look like money values (ie 34.45) is there a way to convert them into float variables? everytime i try I get this error: "numb = float(my_line) ValueError: empty string...
1
by: donpro | last post by:
https://testbed.odysseyshipping.com/index.php This is driving me nuts. I've spent much time trying to style this page footer but because I cannot set widths using "display: inline". I've tried...
0
by: Matthieu Brucher | last post by:
2008/11/5 L V <somelauw@yahoo.com>: Hi, I don't think the Python developers list is th best list to post this kind of question. What version of Python did you use for this test? Matthieu
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
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
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
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
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...

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.