2012-02-04 2 views
138

У меня есть программа на C++ (скомпилирована с использованием g ++). Я пытаюсь применить два двойников в качестве операндов функции модуля, но я получаю следующее сообщение об ошибке:Нельзя использовать модуль в двухместных номерах?

error: invalid operands of types 'double' and 'double' to binary 'operator%'

Вот код:

int main() { 
    double x = 6.3; 
    double y = 2; 
    double z = x % y; 
} 
+9

Как уже было отмечено, FMOD() обеспечивает необходимую функцию. Как еще не было отмечено, важно понять, что ошибки округления во втором операнде 'fmod' могут вызвать неожиданное поведение. Например, 'fmod (1, 0.1);' должно математически быть нулевым, но фактически будет почти 0,1. Степень ошибки возрастает с величиной частного. Например, 'fmod (9E14, 0.1);' оценивается примерно до 0,05, что с математической точки зрения просто неверно. – supercat

+1

@supercat более подробная информация была бы потрясающей. Я думаю, есть представление о том, что происходит за кулисами, чтобы заставить то, что вы говорите, быть правдой, но было бы полезно увидеть причины, почему то, что вы говорите, истинно; было бы интересно посмотреть, как это работает за кулисами (я думаю, что понимаю, но очень легко ошибаюсь). – RastaJedi

+2

Значения с плавающей запятой представляют собой точные целочисленные кратные или доли степеней двух. Например, целочисленный литерал 0,1 равен 3602879701896397/36028797018963968 (последнее значение имеет силу два). 'fmod (x, 0,1)' будет делить х на эту точную долю и взять остаток, а не делить на числовое значение «одна десятая». – supercat

ответ

214

Оператор % для целых чисел. Вы ищете fmod() function.

#include <cmath> 

int main() 
{ 
    double x = 6.3; 
    double y = 2.0; 
    double z = std::fmod(x,y); 

} 
+0

Я программирую на C++ для Qt, и fmod имеет там ошибку. Результатом fmod (angle, 360) может быть 360 (WAT ?!) – Paul

+1

@Paul: Это, вероятно, не ошибка. Если 'angle', скажем,' 359.9999999', то как 'angle', так и' fmod (angle, 360) 'скорее всего будут отображаться как' 360'. (При необходимости добавьте еще 9 секунд.) Попробуйте напечатать значения, например, с точностью до 50 цифр. –

33

fmod(x, y) - это функция, которую вы используете.

2

Использовать fmod() от <cmath>. Если вы не хотите, чтобы включить заголовочный файл C (примечание: U не может быть float или double):

template<typename T, typename U> 
constexpr T dmod (T x, U mod) 
{ 
    return !mod ? x : static_cast<long long>(x) % mod + x - static_cast<long long>(x); 
} 

//Usage: 
double z = dmod<double, unsigned int>(14.3, 4); 
double z = dmod<long, short>(14, 4); 
//This also works: 
double z = dmod(14, 4); 
double z = dmod(14, 0); 
double z = dmod(myFirstVariable, someOtherVariable); 
+0

Почему вы не хотите включать заголовочный файл C? Вот для чего это. –

 Смежные вопросы

  • Нет связанных вопросов^_^