2013-04-28 3 views
1

Мне интересно, потому что когда я запускаю свой код в режиме проверки, похоже, есть некоторые несоответствия. Например:В чем разница между x.pow (n) и pow (x, n)?

List<List> getFactors(int n) 
{ 
    List<List> factors = [[1, n]]; 
    double top = pow(n,1/2); 
    int test = 2; 
    while (test <= top) 
    { 
     if (n % test == 0) 
      factors.add([test, n ~/ test]); 
     test++; 
    } 
    return factors; 
} 

работает как есть, но когда я изменить pow(n,1/2) к n.pow(1/2) она возвращает ошибку в зарегистрированном режиме. Единственное исправление - изменить тип n на двойной. Почему это? Также было бы приятно узнать общие различия между ними. Благодаря!

+0

Я не думаю, что int, num или double имеют метод pow, есть только Math.pow(). http://api.dartlang.org/docs/releases/latest/dart_math.html#pow http://api.dartlang.org/docs/releases/latest/dart_core/num.html –

+0

Я знаю, что он не указан в api, но попробуйте что-то вроде 'print (9.pow (2));' и оно будет работать. – CopOnTheRun

ответ

3

Обновление: int/num/double.pow() в настоящее время существуют только в виртуальной машине и будут removed. Вместо этого используйте math.pow().


Сигнатура int.pow() является:

int pow(int exponent) 

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

int i = 5; 
i.pow(1/2); 

Так вызова int.pow() ожидает целочисленный показатель (проверяется только в зарегистрированном режиме), и возвращает целое число.

И, вызывая math.pow (num x, num exponent), не требует целочисленной экспоненты и может возвращать double, если x является целым числом, а показатель является двойным.

Вот ссылка на документацию math.pow(). Вот ссылки на исходный код int.pow() и math.pow(), чтобы вы могли видеть, что происходит под капотом.

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