2010-01-07 9 views
18

나는 float 배열을 가지고 있으며 자바에서 double 배열로 변환하고 싶습니다. 배열을 반복하고 새 배열을 만드는 확실한 방법을 알고 있습니다. 나는 자바가 double []으로 작업하기를 원하는 곳에서 float []을 부드럽게 소화 할 것이라고 기대했지만, 이것으로는 작동하지 않는다. 이 전환을 우아하고 효과적으로 수행 할 수있는 방법은 무엇입니까?자바에서 float 배열을 double 배열로 변환하는 방법은 무엇입니까?

+1

float와 double은 크기와 비트 패턴에 따라 완전히 다른 데이터 유형이므로 "우아하게"수행 할 방법이 없습니다. 따라서 명백한 방법이 유일한 방법입니다. –

답변

30

기본적으로 무언가은 각 값의 변환을 수행해야합니다. JITting 이후에 처리하는 데 사용되는 코드가 다르기 때문에 두 배열 유형 사이에 암시 적 변환이 없습니다. 요소 크기가 다르므로 float은 변환이 필요하지만 double은 그렇지 않습니다. 데이터를 읽을 때 변환이 필요하지 않은 참조 유형에 대한 배열 공분산과 비교하십시오 (비트 패턴은 Object 참조와 같은 String 참조와 동일하며 요소 크기는 모든 참조 유형에 동일 함).

간단히 말해서, 뭔가가 루프에서 변환을 수행해야합니다. 이 작업을 수행하는 기본 제공 방법에 대해서는 알지 못합니다. 나는 어딘가에 제 3 자 라이브러리에 존재한다고 확신하지만, 이미 그러한 라이브러리 중 하나를 사용하지 않는다면, 나는 당신 만의 방법을 쓸 것입니다. 편의상 예제 구현은 다음과 같습니다.

public static double[] convertFloatsToDoubles(float[] input) 
{ 
    if (input == null) 
    { 
     return null; // Or throw an exception - your choice 
    } 
    double[] output = new double[input.length]; 
    for (int i = 0; i < input.length; i++) 
    { 
     output[i] = input[i]; 
    } 
    return output; 
} 
+0

확장 메소드로 사용할 수도 있습니다. – Seth

+3

@Seth : 이것은 C#이 아닌 Java입니다. –

+0

'convertToDoubles' 또는'toDoubles'라고 이름을 붙일 수있어 다른 원시적 (및 박스형)의 과부하를 제공 할 수 있습니다. –

1

실제로 float 배열을 이중 배열로 복사해야합니까? 당신은 당신이 사용할 수있는 수레를 ... 사용하는 경우 컴파일러 및 유형에 문제가

float x = 0; 
double d = Double.valueOf(x); 

사본을 복용하여 어떤 이점을 얻을 수 있습니까?하는 경우 부동 소수점 기반의 계산 결과에 더 높은 정밀도가 필요한 경우 결과를 double으로 지정하십시오. 배열의 복사본을 가지고 복사 기능을 수행하는 데 많은 단점이 있음을 알 수 있습니다. 특히 크기가 큰 경우에는 더욱 그렇습니다. 정말로해야하는지 확인하십시오.

IntStream.range(0, floatArray.length).mapToDouble(i -> floatArray[i]).toArray(); 

을하지만 (청소기, 더 빨리, 더 의미가) 존 소총의 기능을 사용하는 것이 좋습니다 :

+1

나는 플로트 []에서 데이터를 가지고있는 동안'double []'을 필요로하는 메소드를 호출하는 아주 분명한 이유가있다. 분명히, –

+0

그러나 OP는 그것을 언급하지 않는다. 나는 그가 그것을 요구 한 이후로 대안을주고 싶었다. – Simon

+0

Andreas_D가 설명했습니다. 나는 서로 놀기 위해 두 개의 도서관을 만들 필요가있었습니다. 그 중 하나는 double [] 벡터로, 다른 하나는 float [] (수학적으로 의미있는 벡터)로 작동합니다. 배열을 캐스팅하는 자바 문제는 이러한 라이브러리와 일치하는 것은 그리 간단하지 않습니다. 배열을 반복하지 않아도 솔루션이 존재하지 않는 것 같습니다. 답장을 보내 주셔서 감사합니다. – fifigyuri

7

자바 (8)에서 당신이, 당신이 정말로 원하는 수있는 경우 HTH는 않습니다.

+0

Jon Skeet의 것이 더 좋다고 나는 사지 않습니다. 사실, 이것은 훨씬 더 빨리 최적화되고 동시에 수행 될 수 있습니다.무슨 일이 일어나고 있고 (double []) floatArray와 동등한 함수가 될지도 모릅니다. 스트림을 사용하는 이유는 컴파일러에게 우리가 어떻게 처리했는지 또는 어떤 순서로 상관하지 않는지를 알려주고 모든 값을 다른 것들에 매핑하기 위해서입니다. 그것들을 외부로 반복하기보다는. – Tatarize

관련 문제