0.1 을 10번 더하면 당연히 1.0 이어야 하겠지만, 컴퓨터에서는 그렇지가 않다. 그건 아주 간단한 코딩으로 확인 해 볼수 있다.

#include <stdio.h>

int main()
{
    double a = 0.0;
    int i;

    for (i=0;i<
 10 ;i++)
        a += 0.1;

    if (a == 1.0)
        printf("a == 1.0 \n");
    else
        printf("a != 1.0 !!!!\n");

    return 0;
}

 
이 간단한 코드의 결과는 언제나  a != 1.0 !!!! 를 출력하며, C 언어가 아니더라도, 실수(real number)를 처리하는 대부분의 컴퓨터 언어에서는 동일한 결과를 보인다. 

그 이유를 이해하기 위해서는 double (또는 float) 라는 데이터 타입에 대해서 알아야 한다. TCPL 에 의하면 이 데이터 타입은 달랑 이렇게 정의되어 있다.

float : single precision floating point  (단정도 부동 소수점)
double : double precision floating point 
(배정도 부동 소수점) 
long double : extra precision floating point 
(??) 

실제로 C 언어에는 저걸 어떻게 구현해야 하는가에 대한 내용이 없다. int 같은 다른 데이터 타입과 마찬가지로, 실제로 사용하는 컴퓨터나 OS 나 컴파일러에 따라 적당히 맞추어 사용하게끔 되어 있다.

하지만, 다행히도 이에 관련된 IEEE-754 라는 표준이 있어서, 대부분의 컴퓨터들은 이를 따르고 있다. 원래 표준은 1985년에 제정되었는데 ( http://en.wikipedia.org/wiki/IEEE_754-1985 ) , 2008년에 개정되어 http://en.wikipedia.org/wiki/IEEE_754-2008 로 바뀌었다.

여튼 double 은 64비트라는 유한한 자리수내에서 표현되기에, 모든 수를 완벽하게 표시하는 것은 불가능하며, 표현할 수 있는 가장 가까운 값을 사용하게끔 되어 있다. 물론 에러 없이 완벽하게 표현되는 수도 있지만, 그렇지 않는 수가 훨씬더 많다. 특히 이진수로 표현했을때, 순환소수가 되는 수는 더욱더 그렇다.

예를 들어 십진수로 0.5 는 이진수로 표현했을때 0.1 (2) 가 되어 유한소수가 되기 때문에, 정확히 표현히 된다. 하지만, 십진수로 0.1 은 이진수로 표현하면 순환소수가 되며, 이는 64비트라는 유한한 방법으로 표현할 수가 없고, 적당한 수준에서 잘라낸 근사값을 사용할 수 밖에 없다.

0.1 (10) => 0.0 0011 0011 0011 0011 .... (2)

실제로 0.1 을 double 로 저장하면 16진수로 보면 3FB9 9999 9999 999A 이라는 값이 된다. 이를 IEEE-754 표준을 기준으로 해서 다시 풀어서 환산해 보면, 0.100000000000000005551115123126 이 되어, 0.1 보다 아주 조금이나마 다른 값이 된다. 

참고로 0.1 은 살짝 커진값으로 저장되지만, 0.3 같은 경우는 3FD3 3333 3333 3333 으로 저장되는데, 계산해 보면 0.299999999999999988897769753748 이란 값이 되어 아주 조금 작아 진다.

즉, 0.1 을 3번 더한 값은 0.3 과 다르고, 0.1 을 10번 더한 값은 1.0 과 다르다.
특이한건 0.1 을 5번 더하면 0.5 와 동일하다. 그런데, 10번 더하면 1.0 과 다르다. 


(추가사항)

이런 이유로 일부 개념 없이 만들어진 계산기에서는 그 결과가 0.3 이 되어야 하나, 0.2999999999 로 출력되는 경우도 있다. 이는 위의 경우를 보면 알수 있듯이, 내부적으로는 0.299999999999999988897769753748 이라고 저장된 값을 적당한 자리수에서 '그냥 잘라 내서' 출력했기 때문에 발생한다.

이런 문제를 해결하는 것은 의외로 간단하다. '반올림' 처리를 하면 된다. 예를 들어 소수점 아래 10자리까지 출력한다고 하면, 11번째 자리에서 반올림을 하면 된다. 그냥 0.00000000005 를 더한 뒤 10자리에서 잘라 버리는 것으로 해결할 수 있다.

(좀더 정확한 계산을 위해서는 IEEE-754 표준을 기반으로 fraction 에 1 을 더해주면 된다.)

예를 들어 0.1 은 
0.100000000000000005551115123126 + 0.00000000005 = 0.100000000050000005551115123126 가 되며, 소수점 10자리까지만 출력하면 0.1000000000 이고, 소수점 아래 불필요한 0 을 제거하면 0.1 이 된다.

그리고, 문제가 되는 0.3 의 경우는
0.299999999999999988897769753748 + 0.00000000005 = 0.300000000049999988897769753748 가 되며, 소수점 10자리까지만 출력하면 0.3000000000 이고, 소수점 아래 불필요한 0 을 제거하면 0.3 이 된다.

이런 문제가 발생하는 계산기는, 초보 프로그래머가 정말 개념없이 만들었다는 것을 의미한다.

- 이쁜왕자 -
- Valken the SEXy THief~~ ^_* -


Posted by 이쁜왕자
시게이트에서 모멘터스 XT 2세대 제품을 발표했다. 이 모멘터스 XT 라는 제품은 SSD 와 HDD 를 합쳐서 만든 hybrid HDD 제품인데, 기존 제품을 용량과 성능면에서 업그레이드 해서 새로 발표했다. 이전 모델은 500GB(또는 250GB) HDD 에 4GB SSD 가 달려 있었는데, 이번엔 750GB HDD 에 8GB SSD 를 달아서 나왔다.

이번에 제품 발표를 하면서 Hybrid HDD 라는 표현 대신에 SSHD 라는 표현을 사용했다. SSHD 는 Solid State Hybrid Drive 의 약자인데, 기존에 사용한 Hybrid HDD 라는 표현이 뭔가 마케팅적으로 큰 표과가 없는지 새로운 이름을 붙혔다. 훨씬 더 SSD 스러운 느낌이 난다는 점에서 나쁘지 않은 이름 같다.

SSHD 는 포지션상 SSD 보단 싸고 HDD 보단 비싸며, HDD 보단 성능이 좋고 SSD 보단 성능이 낮다. HDD 보다 비싸기 때문에, 이거 사느니 SSD 산다는 사람이 있는데, 솔직히 SSD 가 훨씬 더 비싸다.

이글을 쓰는 2011년 12월 현재 HDD, SSHD, SSD 의 가격은 다음과 같다. (2.5 인치 기준, 모델 상관 없이 최저가 선택)

 용량  120GB  250GB  500GB   750GB 1TB 
HDD    75,000원  86,000원  119,000원  126,000원 
SSHD    98,000원  186,000원     
SSD  178,000원  446,000원  1,094,000원     
(주: 최저가 제품 기준이라, 많이 팔리는 메이저 브랜드 제품 가격과는 차이가 있을수 있음.)

250GB 를 기준으로 하면, HDD 살 돈에 조금 더 보태서 SSHD 사는게 의미 있지만, 이는 250GB HDD 의 가성비가 워낙 나빠서 나온 결과일뿐이다. 500GB 를 기준으로 보면, 가격적으로 2배 이상의 차이가 난다는 것을 알 수 있다. 하지만, 같은 용량의 SSD 는 애초에 자릿수가 다르다 !!
  
1GB당 가격  120GB  250GB  500GB   750GB 1TB 
HDD    300원  172원  159원  126원 
SSHD    392원  372원     
SSD  1483원  1784원  2188원     

1GB당 가격, 즉 가장 가성비가 높은 용량을 기준으로 하면 HDD 는 126원, SSHD 는 372원이며, 많이 싸졌다고 하는 SSD 는 1483원으로 HDD 의 11배가 넘는다. 그것도, 그나마 노트북용 HDD 라서 이정도 차이 밖에 안나는 것이다. 데스크탑 HDD 라면 2TB 짜리가 13만원정도 하니깐, 1GB당 가격이 65원 밖에 안되고, SSD 의 1/22 밖에 안된다.

사실 데스크탑 유저라면, 이 SSHD 는 포지션이 좀 애매하다고 본다. 그냥 SSD 와 HDD 를 둘 다 달고, OS 및 주로 쓰는 어플리케이션을 SSD 에 깔고, 데이터를 HDD 에 넣어서 쓴다면, 속도와 용량 모든 면에서 만족하며 사용할 수 있기 때문이다.

하지만, 반대로 노트북 사용자라면 이 SSHD 가 의미가 있을 가능성이 높다. 그건 대부분의 노트북은 HDD 를 1개만 장착할 수 있기 때문이다. 즉, 데스크탑처럼 SDD 와 HDD 를 둘 다 달아서 쓸 수가 없다. HDD 달아 쓰자니 성능이 아쉽고, SSD 달아 쓰자니 높은 가격 압박으로 용량을 대폭 낮춰야 한다. 위의 표를 보면 알수 있듯이 1TB HDD 살 돈으로는 SSD 의 용량을 겨우 90GB 정도 살 수 있다. 내부에 SSD 를 달고, 외장 HDD 를 연결해서 쓰는 방법도 생각해 볼 수 있지만, 외장 HDD 만큼 무거워지고 부피가 늘어 나는 것은 노트북의 휴대성을 지대하게 저해하는 요소이다.

이런 상황에서 SSHD 는 조금 비싸더라도, 성능과 용량 두마리의 토끼를 잡을 수 있는 좋은 선택이라는 생각이 들며, 애초에 이 제품은 노트북 사용자를 타겟으로 만들어졌다고 보는게 옳을 것이다. 

위의 표를 기준으로 해서 예측해보면 이번에 발표한 750GB 제품은 25~30만원 정도의 가격이 붙을 것으로 예상되는데, 얼마나 팔리게 될지는 나와 봐야 알 것 같다. 또한, 1세대 제품에서 프리징이 발생하는 등의 문제가 있었는데, 2세대 제품에서 얼마나 개선되었느냐가 관건일 것 같다.

- 이쁜왕자 -
- Valken the SEXy THief~~ ^_* - 
Posted by 이쁜왕자

아으.. KIDS..

2011/12/05 15:23
아으.. KIDS..

금단증상 발생!! OTL

- 이쁜왕자 -
- Valken the SEXy THief~~ ^_* -
 
Posted by 이쁜왕자
<< PREV : [1] : [2] : [3] : [4] : [5] : ... [60] : NEXT >>

BLOG main image
이쁜왕자 만쉐~~
이쁜왕자 만쉐이~~ 만쉐이~~ 만만쉐이~~ by 이쁜왕자

공지사항

카테고리

분류 전체보기 (438)
사진첩 (5)
낙서장 (179)
게임판 (113)
퍼즐판 (39)
지름신 (30)
캐슬라이프 (47)
퍼온것들 (24)

글 보관함

달력

«   2012/02   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      
Total : 472,660
Today : 187 Yesterday : 272