# Divided by zero error

• ### Question

• Hi,
I've got "Divided by zero error" to last 2 lines below. What to adjust?
```            if (Stopwatch.Frequency > 0)
{
long microseconds = sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L));
long nanoseconds = sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L * 1000L));```

Many Thanks & Best Regards, Hua Min

Tuesday, February 12, 2019 10:16 AM

### Answers

• Observe that Stopwatch.Frequency is a long, and your 1000L constants are also longs. This causes the compiler to generate a division of type long, i.e., it will not have any decimal places. Therefore, if the result is less than 1 it will be rounded to zero.

For example, if the Frequency is less than 1000000, then (Stopwatch.Frequency / (1000L * 1000L)) will be zero. Subsequently, when computing sw.ElapsedTicks divided by the preceding value, you get a division by zero.

One easy solution is to change the order in which the operations are done by moving around the parentheses:

long microseconds = (sw.ElapsedTicks* (1000L * 1000L)) / Stopwatch.Frequency;

Of course, you can now get an overflow if the product is too large. At this point, you may consider switching over to floating-point arithmetic.

• Proposed as answer by Tuesday, February 12, 2019 10:18 PM
• Marked as answer by Wednesday, February 13, 2019 7:53 AM
Tuesday, February 12, 2019 10:10 PM

### All replies

• Consider the elapsed time example from the documentation at https://docs.microsoft.com/en-us/windows/desktop/SysInfo/acquiring-high-resolution-time-stamps#examples-for-acquiring-time-stamps

using System.Diagnostics;

long StartingTime = Stopwatch.GetTimestamp();

// Activity to be timed

long EndingTime  = Stopwatch.GetTimestamp();
long ElapsedTime = EndingTime - StartingTime;

double ElapsedSeconds = ElapsedTime * (1.0 / Stopwatch.Frequency);

• Edited by Tuesday, February 12, 2019 10:39 AM
Tuesday, February 12, 2019 10:38 AM
• Observe that Stopwatch.Frequency is a long, and your 1000L constants are also longs. This causes the compiler to generate a division of type long, i.e., it will not have any decimal places. Therefore, if the result is less than 1 it will be rounded to zero.

For example, if the Frequency is less than 1000000, then (Stopwatch.Frequency / (1000L * 1000L)) will be zero. Subsequently, when computing sw.ElapsedTicks divided by the preceding value, you get a division by zero.

One easy solution is to change the order in which the operations are done by moving around the parentheses:

long microseconds = (sw.ElapsedTicks* (1000L * 1000L)) / Stopwatch.Frequency;

Of course, you can now get an overflow if the product is too large. At this point, you may consider switching over to floating-point arithmetic.

• Proposed as answer by Tuesday, February 12, 2019 10:18 PM
• Marked as answer by Wednesday, February 13, 2019 7:53 AM
Tuesday, February 12, 2019 10:10 PM