В C#, как я реализую модуль как Google, calc делает?

В ссылке, которую вы упомянули в своем вопросе, автор сказал:

Для Android API 24 и выше для этого требуется другой код, так как API изменился.

blockquote>

Таким образом, вы должны проверить версию вашего устройства, используя методы, подобные , , а затем вызвать соответствующую функцию.

6
задан Blorgbeard 26 January 2009 в 03:18
поделиться

7 ответов

Хотя это для Java, Java также имеет то же поведение для модуля. (т.е. -40 % 360 == -40).

Ниже кода должен дать ответ от [0. 360), независимо от данного угла, положительного или отрицательного.

public class Mod
{
    public static int mod(int a, int b)
    {
        if (a < 0)
            return b + (a % b);
        else
            return a % b;
    }

    public static void main(String[] args)
    {
        System.out.println(mod(40, 360));   // 40
        System.out.println(mod(-40, 360));  // 320
        System.out.println(mod(-400, 360)); // 320
    }
}

Обратите внимание, что работы, когда данный угол будет прошлый-360.

9
ответ дан 8 December 2019 в 13:50
поделиться

В то время как Ваше решение работает на проблему, у Вас есть алгоритм, на самом деле не идентично тому, используемому Google. Это отличается при использовании отрицательного делителя.

public double GoogleModulo(double value, double divisor)
{
    long q = (long)Math.Floor(value / divisor);
    return value - q * divisor;
}

Console.WriteLine(GoogleModulo(  40,  360)); //   40
Console.WriteLine(GoogleModulo( -40,  360)); //  320
Console.WriteLine(GoogleModulo(-400,  360)); //  320
Console.WriteLine(GoogleModulo(  40, -360)); // -320

Проверьте ответ Google на последнее вычисление здесь.

Алгоритм объяснен на Википедию и приписан Donald Knuth.

4
ответ дан 8 December 2019 в 13:50
поделиться

Это должно дать Вам необходимые результаты

public double Angle {
    get { return _Angle; }
    set { _Angle = value % 360 + (value % 360 < 0 : 360 : 0); }
}

Я предполагаю, что 360 градусы, и Вы пытаетесь найти, где в {0, 360} угол находится.

3
ответ дан 8 December 2019 в 13:50
поделиться

Ультрасовременная операция является очень медленной. Если возможная замена битовой маской.

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

C код:

#define BIT_MASK (0xFFFF)
if (a < 0) {
    return b + (a & BIT_MASK);
} else {
    return a & BIT_MASK;
}

Не стесняйтесь делать #define чем-то, что является временем выполнения. И не стесняйтесь корректировать битовую маску, чтобы быть безотносительно питания два, что Вам нужно. Как 0xFFFFFFFF или питание два Вы выбираете реализацию.

2
ответ дан 8 December 2019 в 13:50
поделиться
(360 * Math.floor(Math.abs(value) / 360) + value) % 360
-1
ответ дан 8 December 2019 в 13:50
поделиться

Если Ваши значения не будут дико из диапазона, можно сделать немного цикла.

while (value < 0) {
  value = value + 360;
}
while (value > 360) {
  value = value - 360;
}
-1
ответ дан 8 December 2019 в 13:50
поделиться

// go 'round once

набор {_Angle = (оценивают + 360), % 360}

1
ответ дан 8 December 2019 в 13:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: