2013-08-05 4 views
-1

Получение некоторых странных результатов от printf.Ошибочное поведение с printf

double scale = 129/1024; 

printf("%f \n", scale); 

печатает либо -0.000000, 0.000000 или некоторые огромные случайное число, как 947634637338383939387378370000000000000.00000. Кажется, они случайным образом чередуются между ними каждый раз, когда я компилирую и запускаю. Программа намного больше, но я не могу понять, что может повлиять на printf в этой ситуации. Именно так эти два утверждения появляются в моей программе. Что я сделал?

+0

Я не уверен, что это технически дублирующий вопрос. Это может быть проблема с 'printf', хотя я лично считаю, что это случай деления' int', связанного с плавающей запятой. –

+0

@Kyle_the_hacker: Это не относится к переменной 'double' tho. Меня это не удивило бы, если бы это была неинициализированная ценность. –

+1

«% f» принимает поплавок, а не добулу. – kfsone

ответ

0

Печать нулевого нестабильного поведения, он показывает вам результат деления 129/1024, и поскольку оба эти числа являются целыми числами, результат равен 0. Затем это присваивается двойнику.

Устранить эту проблему, изменив 129 на 129.0, что делает его double.

«Большое количество» не может быть объяснено из кода, который мы можем видеть. Я предполагаю, что есть еще более хороший код, чем эти две строки, и, вероятно, что-то происходит не так, в другом месте, что влияет на результат.

+0

И как вы объясняете другие ценности, которые он получает? –

+1

Не знаю. Я боюсь, что это, вероятно, в «остальной части кода, который мы не видим». Или что-то не так с аппаратным обеспечением. –

+0

@RanEldan: Но не стесняйтесь указать, где мой вышеприведенный комментарий неправильный. Я хочу учиться. –

0

Я ожидаю, что он будет печатать 0.000000 все время. (129/1024) = 0 для целочисленной арифметики.

+2

И как вы объясняете другие ценности, которые он получает? –

+0

Я честно не знаю. Я уверен, что есть дополнительный код, который не отображается, или что-то подобное. 'double d = 129/1024' будет * всегда * производить нулевое значение. –