Деление без знака на длинный - PullRequest
3 голосов
/ 29 июня 2011

В настоящее время делается попытка разделить длинный без знака длинный на статическое значение.

Длинный длинный без знака содержит количество микросекунд, которое потребовалось для завершения операции.Я хочу взять это значение и преобразовать его в секунды.

Вот фрагмент кода:

double udDiffTime = ullHighResDiffTime / (unsigned long long)1000000;

В одном случае с моим отладчиком я вижу ullHighResDiffTime = 639. Следовательно, udDiffTime= 0,000639.Тем не менее, я получаю udDiffTime = 0.

Я уверен, что я где-то ошибаюсь.Я пытался использовать 1000000LL вместо того, чтобы приводить его с помощью (unsigned long long), но разницы нет.

Ответы [ 5 ]

7 голосов
/ 29 июня 2011

Вы делаете целочисленное деление, поэтому, если результат равен 0,000639, он будет усечен до 0.

Если вы хотите получить результат с плавающей запятой, вам придется использовать хотя бы один метод с плавающей запятой.точечный операнд.Попробуйте, например, изменить (unsigned long long) 1000000 на 1000000.0.

Длинная длина без знака может составлять до 18 446 744 073 709 551 615.A double может достигать 1.7E308 (т. Е. Один с 308 нулями).Уловка в том, что чем выше значение, тем меньше точность, поэтому вам нужно спросить себя, действительно ли большие значения должны быть такими точными или важнее, какое значение имеет число.

1 голос
/ 29 июня 2011

Измените его на

double udDiffTime = ullHighResDiffTime / 1000000.0;

, чтобы получить ожидаемый результат.

0 голосов
/ 29 июня 2011

Разделение длинного знака без знака (или любого целого числа) с одним и тем же типом приводит к тому же типу. Затем вы конвертируете значение в double, но результат уже равен нулю.

Разделите это на два.

0 голосов
/ 29 июня 2011

Если тип ullHighResDiffTime имеет тип unsigned long, то вы делите целое число на целое число, которое не будет вызывать арифметику с плавающей запятой.

Используйте это вместо:

double udDiffTime = ullHighResDiffTime / 1000000.0;

0 голосов
/ 29 июня 2011

unsigned long long является целочисленным типом, поэтому используется интегральное деление.Только после деления значение преобразуется в double.Попробуйте разделить на 1000000.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...