2017-10-27 10 views
0

완전히 언어 별 일 수 있으므로 여기서 자바를 예로 사용 하겠지만 일반적으로이 방법에 관심이 있습니다. 물론
, 간단하고 확실한 방법은 이것이다 :10의 힘을 얻는 가장 빠른 방법

Math.pow(10, x) 

하지만 내가 아는 한, 전력은 매우 비용이 많이 드는 작업이다. 따라서 더 명백한 것처럼 보이기 때문에 더 좋은 방법이 있어야한다고 생각했습니다. 1 후에 x 제로가 필요합니다!

편집 : 예, 조숙 한 최적화 일 수 있습니다. 컨텍스트는 종종 이런 식으로 뭔가를 사용하여 n 개의 소수 자릿수로 반올림 동작입니다 :

private final static int[] powersOf10 = {1, 10, 100, 1000, 10000}; 
public static double round(double number, int decimals) { 
    if(decimals < 5) 
     return Math.rint(number/powersOf10[decimals]) * powersOf10[decimals]; 
    double c = Math.pow(10, decimals); 
    return Math.rint(number * c)/c; 
} 

당신은 이미 가장 많이 사용되는 값에 대한 조회 테이블을 사용하여 볼 수 있듯이 이것은, 내가 사용하는 현재의 반올림 기능입니다, 하지만이 문제를 개선하기 위해 약간의 마법 같은 것이 있는지 궁금합니다.

+10

이것은 조기 최적화의 명백한 사례처럼 들립니다. 이 라인에 상당한 시간이 소요되었음을 보여주는 통계가 있습니까? –

+0

이진 수학에 대한 더 나은 이해를 얻으려면 흥미로운 질문이 있습니다. 문제는 수학 라이브러리가 제공하는 것보다 더 빠른 방법이 아니라는 것입니다. 그래서 명확하게하기 위해이 질문에 대한 이유를 설명해주십시오. (Ei가 최적화 질문인가, 아니면 궁금증 이니?) – n247s

+0

사실 ...'Math.pow'는 [StrictMath.pow'에 위임합니다.] (http://grepcode.com/file/repository.grepcode. (C 언어로 쓰여진) (http : //www.java.sun.com/javk/java/language/jdk/ openjdk/8u40-b25/java/lang/StrictMath.java # StrictMath.pow % 28double % 2Cdouble % 29) //hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/native/java/lang/StrictMath.c)). 왜 더 빨리 * 필요합니까? 이것이 성능 저하로 생각되는 원인은 무엇입니까? – Makoto

답변

7

가장 빠른 방법은 열 개 맞는없이 높은 전력 인 이후 int에 ...

static final int[] POWERS_OF_10 = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000}; 
static int powerOfTen(int pow) { 
    return POWERS_OF_10[pow]; 
} 

입니다. 미안하지만 뭔가 더 시원한 것을 기대하고 있었다면.

+2

10의 더 높은 힘을 원한다면 '긴'유형을 사용하십시오. 최대 값은 1,000000000000000000이되어야합니다. –

+0

공정한 점 ... 전에 최대 값에 대해 실제로 생각하지 않았습니다 ... – Xerus