Проблема заключается в целочисленном делении во внутренней части выражения, которое усекает значение (исключая дробную часть). Один из вариантов, как уже упоминалось, состоит в том, чтобы сделать каждую константу числом с плавающей запятой, добавив после нее «.0» или «f». В качестве альтернативы, вы можете полностью исключить скобки из самого внутреннего выражения. Поскольку M_PI
является числом с плавающей запятой, а умножение в C ассоциативно слева (то есть идет слева направо), первое умножение (2 * M_PI) будет преобразовано в число с плавающей запятой, как и каждое последующее умножение. Поскольку cos()
возвращает число с плавающей запятой, pNumber
будет присвоено значение с плавающей запятой без целочисленного деления, следовательно, без потери точности. (Примечание: обычно не стоит рассчитывать на ассоциативность операторов или приоритет, но в этом случае я просто пытаюсь продемонстрировать, что это действительно работает.)
Что касается диапазона чисел, который вы должны ожидать, помните, что косинус (неизмененный) находится в диапазоне от -1 до +1, а не от 0 до 1, так что вы на самом деле видите от -100 до 100 (в теории). Чтобы получить правильный диапазон, вы должны добавить 1, а затем умножить на 50.
Кстати, ошибки компиляции, которые вы получаете в первом случае, связаны с тем, что pi
не определено. Руководство по использованию M_PI
является правильным - для математических констант всегда разумнее (и более последовательно) использовать то, что предоставляет система. Если вам интересно, в Leopard эти константы определены в Math.h, строки 528-540. Вы можете открыть файл, используя File> Open Quickly ... (Cmd-Shift-D) и набрав "Math.h", или дважды щелкнув по M_PI
в своем коде, удерживая Command.