Skip to contentSkip to conversation

improved strmhz()

PATCH New Ilko Iliev 6 participants 8 messages Oct 21, 2008 – Oct 22, 2008

lore
Share & tools
lore

Ilko Iliev

author
#0 lore raw

PATCH 1/1 improved strmhz()

This patch prevents the displaying of results like this:
hz = 1999170000
buf = "200.-83"

index 342cf2b..981a75a 100644

lib_generic/strmhz.c +6 -1
@@ -28,10 +28,15 @@ char *strmhz (char *buf, long hz)
        long m;
 
        n = DIV_ROUND(hz, 1000000L);
-       l = sprintf (buf, "%ld", n);
 
        hz -= n * 1000000L;
        m = DIV_ROUND(hz, 1000L);
+       if ( m < 0 ) {
+               n--;
+               m += 1000L;
+       }
+
+       l = sprintf (buf, "%ld", n);
        if (m != 0)
                sprintf (buf + l, ".%03ld", m);
        return (buf);
#1 lore raw

PATCH 1/1 improved strmhz()

Dear Ilko Iliev,

Quoted 3 lines · In message <[email protected]> you wrote:

This patch prevents the displaying of results like this:
hz = 1999170000
buf = "200.-83"

I think you got one '0' too many in your example - the example would just print "1999.170" which is correct.

Quoted 9 lines
lib_generic/strmhz.c +0 -1
@@ -28,10 +28,15 @@ char *strmhz (char *buf, long hz)
        long m;
 
        n = DIV_ROUND(hz, 1000000L);
-       l = sprintf (buf, "%ld", n);
 
        hz -= n * 1000000L;

lib_generic/strmhz.c char *strmhz (char *buf, long hz) · line 42

Quoted 10 lines
lib_generic/strmhz.c +6 -0
        m = DIV_ROUND(hz, 1000L);
+       if ( m < 0 ) {
+               n--;
+               m += 1000L;
+       }
+
+       l = sprintf (buf, "%ld", n);
        if (m != 0)
                sprintf (buf + l, ".%03ld", m);
        return (buf);

That looks overly complex to me. Can you please check if this patch fixes the problem for your test cases, too:

author
#2 lore raw

PATCH 1/1 improved strmhz()

Quoted 21 lines · Wolfgang Denk

Dear Ilko Iliev,

Quoted 4 lines · In message <[email protected]> you wrote:

This patch prevents the displaying of results like this:
hz = 1999170000
buf = "200.-83"

I think you got one '0' too many in your example - the example would just print "1999.170" which is correct.

Quoted 8 lines
lib_generic/strmhz.c +0 -1
@@ -28,10 +28,15 @@ char *strmhz (char *buf, long hz)
        long m;
 
        n = DIV_ROUND(hz, 1000000L);
-       l = sprintf (buf, "%ld", n);
 
Quoted 16 lines

lib_generic/strmhz.c char *strmhz (char *buf, long hz) · line 42

Quoted 12 lines
lib_generic/strmhz.c +6 -0
        hz -= n * 1000000L;
        m = DIV_ROUND(hz, 1000L);
+       if ( m < 0 ) {
+               n--;
+               m += 1000L;
+       }
+
+       l = sprintf (buf, "%ld", n);
        if (m != 0)
                sprintf (buf + l, ".%03ld", m);
        return (buf);

That looks overly complex to me. Can you please check if this patch fixes the problem for your test cases, too:

Yes, it works.

Signature · 13 lines
Mit freundlichen Gr??en/With best regards,
Ilko Iliev
Ronetix Development Tools GmbH
Waidhausenstrasse 13/5
1140 Vienna, Austria
Tel: +43 1 956 3138 
Tel: +43 720 500 315
Fax: +43 1 8174 955 3464 
E-Mail: iliev at ronetix.at
Web: www.ronetix.at
VAT: ATU63916016
Ronetix GmbH - 1140 Vienna - Gesch?ftsf?hrer: Ilko Iliev
Registergericht: HG Vienna, FN 304979z
#3 lore raw

PATCH 1/1 improved strmhz()

In reply to Wolfgang Denk
Quoted 30 lines
Quoted 1 line

That looks overly complex to me. Can you please check if this patch fixes the problem for your test cases, too:

Quoted 2 lines

From 963e7db81379225b78bfac0d7457300c86d6b4d6 Mon Sep 17 00:00:00 2001

From: Wolfgang Denk <[email protected]>
Date: Tue, 21 Oct 2008 15:53:51 +0200
Subject: [PATCH] Fix strmhz(): avoid printing negative fractions

---
lib_generic/strmhz.c | 2 +-

1 files changed, 1 insertions(+), 1 deletions(-)
lib_generic/strmhz.c +1 -1
index 342cf2b..d6da1d1 100644
@@ -27,7 +27,7 @@ char *strmhz (char *buf, long hz)
 	long l, n;
 	long m;
 
-	n = DIV_ROUND(hz, 1000000L);
+	n = DIV_ROUND(hz, 1000) / 1000L;
 	l = sprintf (buf, "%ld", n);
 
 	hz -= n * 1000000L;
Signature · 1 line
1.5.5.1

I haven't been following this thread, but can we control the number of significant digits. I'm starting to see output like:

Clock Configuration:

        CPU:1500.4294967282 MHz, CCB:600.4294967291 MHz,
        DDR:400.4294967293 MHz (800.4294967289 MT/s data rate)  

(Asynchronous), LBC:37.500 MHz

(it use to look like)

Clock Configuration:

        CPU:1500 MHz, CCB: 600 MHz,
        DDR: 401 MHz (801 MT/s data rate) (Asynchronous), LBC:  37 MHz

- k

#4 lore raw

PATCH 1/1 improved strmhz()

Quoted 33 lines · Kumar Gala
Quoted 29 lines

That looks overly complex to me. Can you please check if this patch fixes the problem for your test cases, too:

Quoted 2 lines

From 963e7db81379225b78bfac0d7457300c86d6b4d6 Mon Sep 17 00:00:00 2001

From: Wolfgang Denk <[email protected]>
Date: Tue, 21 Oct 2008 15:53:51 +0200
Subject: [PATCH] Fix strmhz(): avoid printing negative fractions

---
lib_generic/strmhz.c | 2 +-

1 files changed, 1 insertions(+), 1 deletions(-)
lib_generic/strmhz.c +1 -1
index 342cf2b..d6da1d1 100644
@@ -27,7 +27,7 @@ char *strmhz (char *buf, long hz)
 	long l, n;
 	long m;
 
-	n = DIV_ROUND(hz, 1000000L);
+	n = DIV_ROUND(hz, 1000) / 1000L;
 	l = sprintf (buf, "%ld", n);
 
 	hz -= n * 1000000L;
Signature · 1 line
1.5.5.1

I haven't been following this thread, but can we control the number of significant digits. I'm starting to see output like:

Quoted 3 lines

Clock Configuration:

        CPU:1500.4294967282 MHz, CCB:600.4294967291 MHz,
        DDR:400.4294967293 MHz (800.4294967289 MT/s data rate)  

(unsigned) 4294967289 = (signed) -7 (if I did my math right). This is indicating Wolfgang's patch still does negative remainders, but masks that by printing them as unsigned numbers.

Best regards,
gvb

#5 lore raw

PATCH 1/1 improved strmhz()

In reply to Kumar Gala
Quoted 2 lines · Kumar Gala

I haven't been following this thread, but can we control the number of significant digits.

customizable # of digits is always going to differ according to taste. just lock everyone to like .3 and be done. no point in wasting overhead on this. -mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 835 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20081021/447b3b38/attachment.pgp

#6 lore raw

PATCH 1/1 improved strmhz()

In reply to Kumar Gala

Dear Kumar Gala,

Quoted 21 lines · In message <[email protected]> you wrote:
Quoted 14 lines
lib_generic/strmhz.c +1 -1
@@ -27,7 +27,7 @@ char *strmhz (char *buf, long hz)
 	long l, n;
 	long m;
 
-	n = DIV_ROUND(hz, 1000000L);
+	n = DIV_ROUND(hz, 1000) / 1000L;
 	l = sprintf (buf, "%ld", n);
 
 	hz -= n * 1000000L;
Signature · 1 line
1.5.5.1

I haven't been following this thread, but can we control the number of significant digits. I'm starting to see output like:

Clock Configuration:

        CPU:1500.4294967282 MHz, CCB:600.4294967291 MHz,
        DDR:400.4294967293 MHz (800.4294967289 MT/s data rate)  
Quoted 7 lines

(Asynchronous), LBC:37.500 MHz

(it use to look like)

Clock Configuration:

        CPU:1500 MHz, CCB: 600 MHz,
        DDR: 401 MHz (801 MT/s data rate) (Asynchronous), LBC:  37 MHz

Can you please provide the input to the strmhz() function (the "hz" parameter) that is causing such output?

I am aware that we will have a problem when "hz" exceeds the 2.147 GHz limit (as that's the limit for a "long" data type), but that's another problem, and requires many changes.

Best regards,

Wolfgang Denk

Signature · 6 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
We are all agreed that your  theory  is  crazy.  The  question  which
divides  us  is  whether it is crazy enough to have a chance of being
correct. My own feeling is that it is not crazy enough.  - Niels Bohr
#7 lore raw

PATCH 1/1 improved strmhz()

Hi Wolfgang,

Quoted 11 lines · Wolfgang Denk
Quoted 11 lines
Quoted 11 lines
lib_generic/strmhz.c +1 -1
@@ -27,7 +27,7 @@ char *strmhz (char *buf, long hz)
 	long l, n;
 	long m;
 
-	n = DIV_ROUND(hz, 1000000L);
+	n = DIV_ROUND(hz, 1000) / 1000L;
 	l = sprintf (buf, "%ld", n);
 
 	hz -= n * 1000000L;

<snip>

Quoted 2 lines

Can you please provide the input to the strmhz() function (the "hz" parameter) that is causing such output?

This patch fixes a problem I have seen on the 1.066GHz Canyonlands. Without it I see this:

CPU: AMCC PowerPC 460EX Rev. A at 1067.4294966964 MHz

with it it's this:

CPU: AMCC PowerPC 460EX Rev. A at 1066.667 MHz

Wolfgang, can you check in the new patch version?

Thanks.

Best regards,
Stefan

=====================================================================
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office at denx.de
=====================================================================