From caf7854a3ce16933557ad6ff33e6b210a2109b48 Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Wed, 5 May 2004 07:45:21 +0000
Subject: [PATCH] if the values allow it, avoid floting point math for the
 current speed

---
 lib/progress.c | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/lib/progress.c b/lib/progress.c
index e7e5728eff..51333aff13 100644
--- a/lib/progress.c
+++ b/lib/progress.c
@@ -301,10 +301,21 @@ int Curl_pgrsUpdate(struct connectdata *conn)
     if(0 == span_ms)
       span_ms=1; /* at least one millisecond MUST have passed */
 
-    /* Calculate the average speed the last 'countindex' seconds */
-    data->progress.current_speed = (curl_off_t)
-      (data->progress.speeder[nowindex]-
-       data->progress.speeder[checkindex])/((double)span_ms/1000);
+    /* Calculate the average speed the last 'span_ms' milliseconds */
+    {
+      curl_off_t amount = data->progress.speeder[nowindex]-
+        data->progress.speeder[checkindex];
+
+      if(amount > 0xffffffff/1000)
+        /* the 'amount' value is bigger than would fit in 32 bits if
+           multiplied with 1000, so we use the double math for this */
+        data->progress.current_speed = (curl_off_t)
+          (amount/(span_ms/1000.0));
+      else
+        /* the 'amount' value is small enough to fit within 32 bits even
+           when multiplied with 1000 */
+        data->progress.current_speed = amount*1000/span_ms;
+    }
   }
   else
     /* the first second we use the main average */
-- 
GitLab