2016-05-01 14 views
1

Так что я пытаюсь вычислить обратную матрицу с использованием детерминированной. Мой цикл не получает никаких ошибок, когда я удалить % 26, но когда я включаю его я получаю следующие ошибки:ошибка по модулю при работе с матрицей

«=»: преобразование из «межд» «плавать», возможные потери данных
незаконных, оставленных операнд имеет тип 'float'

Любая помощь в отношении того, как я могу обойти эту проблему, была бы весьма признательна.

for (int i = 0; i < 3; i++) 
    for (int j = 0; j < 3; j++){ 
     if (adjacency_matrix[i][j] < 0) 
      adjacency_matrix[i][j] = (adjacency_matrix[i][j] * 17) % 26; 
     else 
      for (float x = 0; x < 50; x++){ 
       if (x * -26 < adjacency_matrix[i][j]) 
        adjacency_matrix[i][j] = adjacency_matrix[i][j] + x * 26; 
      } 
    } 
+0

Прошу прощения .. Я новичок на сайте, этикет иногда ускользает от меня. Это C++, а матрица - float, ее просто регулярные числа. Целые числа, я использовал float на всякий случай, но я не верю, что любой из них будет десятичным. – Doug

ответ

0

Оператор modulo % работает только для целых чисел. C++ 11 (N3337) 5,6 - 2 (курсив мой):

Операнды * и/должны иметь арифметические или незаданной тип перечисления; операнды% должны иметь интегральные значения или неперечисленное перечисление тип. Обычные арифметические преобразования выполняются в операндах и определяют тип результата.

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

Если у вас есть только целые числа в вашем adjacency_matrix, используйте один из многих целочисленных типов вместо float. Если у вас действительно есть реальные значения поплавка, вы можете использовать fmod.