간혹 타입을 결정할때 아리송할때가 있다.

정확한 범위를 알고 필요한 타입을 쓰자


1. int형으로 하면 얼마까지 나타낼 수 있는가?

  int형으로 했을 경우 Test해 본 결과로는 21억까지 밖에 계산이 안되네요.
  즉, 2,147,483,647 을 아래처럼 해 봤죠.

   int result = Integer.parseInt("2147483646") + 1;
  은 제대로 계산이 되는데,
   int result = Integer.parseInt("2147483647") + 1;
  의 값은  -2147483648이 나오네요...

  2,147,483,647 은 2^(32-1) -1 입니다.

2. 그럼 long형으로 하면 얼마까지 가능할까?

  long형은 9,223,372,036,854,775,807 까지 됩니다.
  '조' 다음이 '경'이니까 9백2십2경 3천조 까지구낭...
   long result = Long.parseLong("9223372036854775807 ) + 1;

  9223372036854775807 + 1 은 -9223372036854775808 로 나오네요.
 
  9223372036854775807 은 2^(64-1)-1 입니다.
 

[결론] 따라서 21억 이상을 표현하려면 long형이 필요함을 알수 있습니다.
  만약 소수점 이하 자릿수도 표현해야 한다면 double형이 필요합니다.
  double형으로 했을 경우도 반드시 만능이 아닙니다.

3. 그럼 자바의 최대 소수점 처리가 가능한 double형은 어디까지인가요?

1)소수 이하의 자리수를 유효숫자 2자리까지 필요하다면 그 수치는
  70조(70,368,744,177,663.99) 까지 입니다.
  아래와 같은 프로그램에서

  import java.text.DecimalFormat;
  DecimalFormat df = new DecimalFormat("#########################.00");
  double d = new Double(src.getText()).doubleValue();
  d += 0.01;
  textfield.setText(df.format(d) );

  70368744177663.99 + 0.01 = 70368744177664 로 제대로 계산되나
  70368744177664.00 + 0.01 = 70368744177664.02 로 0.01의 오차가 발생합니다.

2)만약 double형으로 사용하되 소숫점 이하는 무시한다고 한다면
  9천 7조(9,007,100,000,000,000) 까지만 + 1.0 을 했을 때 정확한 수치가 나옵니다.

3)만약 소수이하 세자리까지 필요하다면 어디까질까요?

  8조 7천9백60억(8,796,093,022,207)까지네요.
  8796093022207 + 0.001 = 8796093022207.001 로 정확하나
  그 다음부턴 0.001의 차이가 납니다.

  (NOTE: 심각하게 차이가 바로 발생하지는 않지만 위 수치 부터 덧셈이나 뺄셈이 약간의
         오차를 보이기 시작합니다.)

  [결론] 에궁 자바는 double외에는 없는데, 어떻하낭? 소수이하를 무시하면 9천 7조 까지만
       계산이 정확하고, 소수 두자리 까진 70조가 넘어면 안되구, 소수 세째자리가진
       8조7천억이 넘어면 안된다더라...
       어쩌나...
       그러나 어디까지라고는 꼭 집어 얘기하진 못하지만, 국방부 같이 몇 백억 단위는
       long형과 double형만으로 계산으로 하여도 문제는 발생하지 않겠네요..

       그러나 은행이나, 금융기관, 국가재정을 다루는 시스템을 꾸밀 때,
       만약 그 시스템이 자바로 되어 있다면,
       수치가 조단위를 를 넘어 갈 경우 long과 double형을 사용하면 계산이
       틀려진다는 걸 꼭 기억하세요.



4. 근데, java.math.BigDecimal 은 뭐하는 거예요?
  java.math.BigInteger도 있던데?

  import java.math.BigDecimal;
  BigDecimal op1 = new BigDecimal("100000000000000000000000000000000000.01");
  BigDecimal op2 = new BigDecimal("10002341234124000000000000000000.2134");
  BigDecimal sum = op1.add(op2);
  textArea.setText(sum.toString());
 
  등과 같이 사용하는데, 아무리 큰 수 일지라도 완벽하게 계산해 냅니다.
  java.math.BigInteger 는 정수형을 계산한다는 것을 제외하고 똑 같습니다.
 
  NOTE: 그러나, 경우에 따라, divide연산의 무한소수의 경우는 여전히 자릿수 고민을 하셔야
      하고, 연산을 위한 성능적인 이슈도 함께 고려되어야 겠지요.

[진짜 결론]
  날로 통화화폐가치가 떨어 지는 요즘 조단위는 심심찮게 신문에 등장하는 수치입니다.
  이젠 천문학적인 숫자가 아니라 일상적인 숫자로 되는 요즘 돈계산을 하실 때,
  아무 생각없이 사칙연산을 할 것이 아니라 보다 유효자리숫자를 고려하여 연산을
  생각하는 꼼꼼한 프로그래머가 됩시다.... ;

  마지막으로 건의를 주신 이원경님께 감사드리며 반영하도록 해야 겠네요.

[PS] 자바의 Default Decimal 형은 float형이 아니라 double형입니다.
  즉 float f = (float) 5.0; 등과 같이 cast연산자를 사용하는 반면에
    double d = 5.0;  이렇게 사용할 수 있는 거죠.
  구태여 자바에서 float형을 쓸 일은 없다고 보여집니다. 유효숫자 자리수만 낮아질 뿐이죠.

자바서비스넷 이원영
------------------------------------------------------- 
  본 문서는 자유롭게 배포/복사 할 수 있으나 반드시
  이 문서의 저자에 대한 언급을 삭제하시면 안됩니다


1) 내부적 연산은 허용된(!) 유효숫자 범위 내에서 가급적 정확하게 하고,
2) 화면으로의 표현은 적절한(!) 범위 내에서 표현하면 되는 것이지요.

1)번의 의미는, 예를 들어 어떤 경우로도 1/3 = 0.33333333....이므로,
float, double, java.math.BigDecimal 등이 허용하는 오차 범위가, 해당 비즈니스적인
면에서 충분하냐에 따라 결정하면 된다는 것이지요.

2)번의 의미는 사칙연산은 앞서와 같이 하면 되는데, 어느 순간이 되면 화면이나 파일과
같이 문자열 형태로 표현되어야 할 시점이 있을 것입니다. 이 경우는 적절한 소숫점
이하 몇자리로 표현하면 사용하면 되는 것이지요.

제목 : Re: Java Float형으로 표현가능한 가장 큰 자연수
글쓴이: 이원영(javaservice) 2003/02/04 23:23:12 조회수:578 줄수:81
IEEE 754 규약에 따른 부동 소수점의 싱글 포맷 형인 자바의 4byte  float형에서
소숫점 이하를 버린 자연수 중, 표현가능한 가장 큰 수는 2의 24승인
16,777,216 입니다.

31               23               15               7             0
S e e e e e e e  e 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0
| |              | |                                             |
| +-- exponent --+ +---------significand(mantissa)---------------+
|
+- sign bit

- Bit 31 (the bit that is selected by the mask 0x80000000) represents the sign of
  the floating-point number. 
- Bits 30-23 (the bits that are selected by the mask 0x7f800000) represent
  the exponent. 
- Bits 22-0 (the bits that are selected by the mask 0x007fffff) represent
  the significand (sometimes called the mantissa) of the floating-point number. 
- positive infinity, the result is 0x7f800000
- negative infinity, the result is 0xff800000
- NaN, the result is 0x7fc00000
- let s, e, and m be three values that can be computed from the argument: 

 int s = ((bits >> 31) == 0) ? 1 : -1;
 int e = ((bits >> 23) & 0xff);
 int m = (e == 0) ?
                 (bits & 0x7fffff) << 1 :
                 (bits & 0x7fffff) | 0x800000;

 number value = s·m·2^(e-150)

E:\temp>java Test
Float.MAX_VALUE=2147483647
2^0 i:1         s:1     e:127   m:8388608       s*m*2^(e-150)=1
2^1 i:2         s:1     e:128   m:8388608       s*m*2^(e-150)=2
2^2 i:4         s:1     e:129   m:8388608       s*m*2^(e-150)=4
2^3 i:8         s:1     e:130   m:8388608       s*m*2^(e-150)=8
2^4 i:16        s:1     e:131   m:8388608       s*m*2^(e-150)=16
2^5 i:32        s:1     e:132   m:8388608       s*m*2^(e-150)=32
2^6 i:64        s:1     e:133   m:8388608       s*m*2^(e-150)=64
2^7 i:128       s:1     e:134   m:8388608       s*m*2^(e-150)=128
2^8 i:256       s:1     e:135   m:8388608       s*m*2^(e-150)=256
2^9 i:512       s:1     e:136   m:8388608       s*m*2^(e-150)=512
2^10 i:1024     s:1     e:137   m:8388608       s*m*2^(e-150)=1024
2^11 i:2048     s:1     e:138   m:8388608       s*m*2^(e-150)=2048
2^12 i:4096     s:1     e:139   m:8388608       s*m*2^(e-150)=4096
2^13 i:8192     s:1     e:140   m:8388608       s*m*2^(e-150)=8192
2^14 i:16384    s:1     e:141   m:8388608       s*m*2^(e-150)=16384
2^15 i:32768    s:1     e:142   m:8388608       s*m*2^(e-150)=32768
2^16 i:65536    s:1     e:143   m:8388608       s*m*2^(e-150)=65536
2^17 i:131072   s:1     e:144   m:8388608       s*m*2^(e-150)=131072
2^18 i:262144   s:1     e:145   m:8388608       s*m*2^(e-150)=262144
2^19 i:524288   s:1     e:146   m:8388608       s*m*2^(e-150)=524288
2^20 i:1048576  s:1     e:147   m:8388608       s*m*2^(e-150)=1048576
2^21 i:2097152  s:1     e:148   m:8388608       s*m*2^(e-150)=2097152
2^22 i:4194304  s:1     e:149   m:8388608       s*m*2^(e-150)=4194304
2^23 i:8388608  s:1     e:150   m:8388608       s*m*2^(e-150)=8388608
2^24 i:16777216 s:1     e:151   m:8388608       s*m*2^(e-150)=16777216
Max Float=16777216

new Float(16777216)=16777216
new Float(16777217)=16777216

Posted by [czar]
,
Posted by [czar]
,

// tomcat - server.xml파일에 DB Connection생성을 위한 설정(<Host>태그 내부에 추가함)


<Context Path="/myapp" docBase="myapp" debug="5" reloadable="true" crossContext="true">

<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"

               maxActive="100" maxIdle="30" maxWait="10000"

               username="sys" password="password" driverClassName="com.mysql.jdbc.Driver"

               url="jdbc:mysql://localhost:3306/javatest?autoReconnect=true"/>

</Context>


//내용설명

Context - path : URL 호출시 사용될 이름

           - docBase : 실제 웹 어플리케이션이 위치한 폴더명

           - debug : 로그 작성 레벨

           - reloadable : 톰캣서버의 재시작 없이 수정된 내용을 불러오기 위한 옵션

           - crossContext : myapp이외의 Context에서도 사용 가능하도록 하는 옵션

Resource - name : Resource명칭(JNDI Lookup 시 사용할 명칭)

             - auth : Resource 관리자를 지정. 여기서는 톰캣컨테이너가 관리자임

             - type : Resource 의 형태 지정. 데이타소스 형태를 지정함

             - maxActive : 최대 연결 가능한 Connection 숫자를 지정함

             - maxIdle : Connection pool 유지를 위해 최대 대기 connection 숫자

             - maxWait : Connection 재 사용을 위해 대기해야 하는 최대 시간(단위:ms)

             - username : DB접속 계정

             - password : DB접속 암호

             - driverClassName : DB와 접속하기 위한 driver 클래스를 지정. 예에서는 MySql임

             - url : 접속한 DB가 위치한 서버명, 포트명, 사용할 데이타베이스명을 지정



// tomcat - web.xml파일에 DB Connection생성을 위한 설정

<resource-ref>

             <description> DB Connection </description>

             <res-ref-name>jdbc/TestDB</res-ref-name>

             <res-type>javax.sql.DataSource</res-type>

             <res-auth>Container</res-auth>

</resource-ref>


//내용설명

resource-ref - description : 참조할 resource에 대한 설명

                 - res-ref-name : 참조할 resource의 명칭. Server.xml에 정의된 이름과 일치해야함

                 - res-type : 참조할 resource 형태로 여기서는 DataSource를 지정함

                 - res-auth : 참조할 resource를 관리할 주체로 톰캣컨테이너를 지정함


Posted by [czar]
,

tomcat 4 버전처럼 server.xml 에 context path 를 추가하지 말란다.

먼말인고..apache 문서를 찾아보니..

보안등을 이유로 이제는 직접적으로 server.xml 에 context path 를 기술하지 말고

따로 xml 파일을 만들어서 거기다가 context path 를 기술하라고 한다.

갑자기 머리가 아파온다. 왜 기술이 발전하면 할수록 계속 개발방법론이 변화가 되야하나..ㅡ.ㅡ;;

방식은 아래와 같다.

우선 server.xml 의 Host name 에다가 자신이 만들고 싶은 host name 을 기술한다.

그다음 tomcat 설치디렉토리/conf/Catalina/ 디렉토리 밑에 host name 에 기술한 이름의 디렉토리를 만든다.

그리고 그 디렉토리안에 ROOT.xml 파일을 만들어서 context path 를 지정하는 형식이다.

예)

톰캣 설치디렉토리 : C:\web\Tomcat

웹 서비스들 페이지가 있는 디렉토리 : D:\work_nio

웹 서비스 페이지 1 : D:\work_nio\swing.naver.com\WEB-INF\src

웹 서비스 페이지 2 : D:\work_nio\me.naver.com\WEB-INF\src

즉, 톰캣이 설치된 디렉토리에서 웹페이지들 및 소스를 나두는것이 아니고

별도의 디렉토리를 만들어서 이곳에서 웹페이지들 및 소스들 넣고 싶은것이다.

보통 이렇게들 많이 운영을 할것이다. apache 의 virtualhost 를 생각하면 될것이다.

위는 swing.naver.com , me.naver.com 으로 웹 서버를 운영하고 싶은 예를 둔것이다.

< 단계 1 >

C:\web\Tomcat\conf\server.xml 편집

  <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false"

    xmlNamespaceAware="false">
  </Host>
 

이렇게만 있는 부분 바로 아래에 다음과 같이 추가를 해준다.


  <Host name="swing.naver.com" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false"

    xmlNamespaceAware="false">
  </Host>

  <Host name="me.naver.com" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false"

    xmlNamespaceAware="false">
  </Host>

그리고 기본적으로 port 는 8080 으로 되어있는데 이렇게 되면 http://swing.naver.com:8080 이런식으로 주소를 넣어야하니

불편하기 그지없다. port="8080" 을 port="80" 으로 변경을 하여 http://swing.naver.com 으로 접속할 수 있도록 해준다.

< 단계2 >

C:\web\Tomcat\conf\Catalina 디렉토리 밑에

server.xml 파일에서 입력해준 host name 으로 디렉토리를 만들어준다.

아마 기본적으로 localhost 라는 디렉토리는 있을 것이다.

즉,

C:\web\Tomcat\conf\Catalina\swing.naver.com

C:\web\Tomcat\conf\Catalina\me.naver.com

< 단계3 >

만들어준 디렉토리밑에 ROOT.xml 파일을 각각 만들어준다.

즉,

C:\web\Tomcat\conf\Catalina\swing.naver.com\ROOT.xml

C:\web\Tomcat\conf\Catalina\me.naver.com\ROOT.xml

< 단계4 >

이렇게 만들어준 각각의 ROOT.xml 에 바로 context path 를 기술해 주면 된다.

C:\web\Tomcat\conf\Catalina\swing.naver.com\ROOT.xml 의 내용

<?xml version='1.0' encoding='utf-8'?>
<Context crossContext="true" docBase="D:/work_nio/swing.naver.com/WEB-INF\src" path="" reloadable="true">
</Context>

C:\web\Tomcat\conf\Catalina\me.naver.com\ROOT.xml 의 내용

<?xml version='1.0' encoding='utf-8'?>
<Context crossContext="true" docBase="D:/work_nio/me.naver.com/WEB-INF\src" path="" reloadable="true">
</Context>

< 단계 5 >

톰캣을 stop 한 후 start 한다.

이제 웹에서 http://swing.naver.com/index.html 하면 나올거에요~

단, D:/work_nio/swing.naver.com/WEB-INF\src 밑에 index.html 파일이 있어야겠고

이런 도메인 주소를 가지고 있어야겠죠.

만약에 지금 내 PC에서 테스트를 하고 싶다면 충분히 localhost 가지고만 하실 수 있습니다.

하지만 자신 PC의 IP로 주위사람들이 웹에서 ip 주소를 입력하여 들어오고 싶을때는

ip로 host name 을 지정하여 위의 단계처럼 만드시면 되겠죠~

Posted by [czar]
,

리몬 99,000

카테고리 없음 2006. 12. 18. 16:09
Posted by [czar]
,


UEFA 챔피언스리그 결승전... 후반 45분. 맨체스터 유나이티드는 뮌헨에게 1-0으로 뒤지고 있는 상태.

그리고 추가시간 3분이 주어지는데.....
Posted by [czar]
,

<script language='javascript'>
<!--
function jsImagesPreview(img,iid) {

Imagesid = iid;

if(event.srcElement.value.match(/(.jpg|.jpeg|.gif|.png|.JPG|.JPEG|.GIF|.PNG|[0-9]{10})/)) {
document.images[Imagesid].src = event.srcElement.value;
document.images[Imagesid].style.display = '';
}else{

if(img) {
document.images[Imagesid].src = img;
document.images[Imagesid].style.display = '';

} else {
document.images[Imagesid].src = '/images/no_img.jpg';
document.images[Imagesid].style.display = '';
}
}
}
//-->
</script>

<form method="post" action="" name="form" enctype="multipart/form-data">

<input name="image5" type="file" size="20" class="input" onChange="jsImagesPreview('','image5')" onFocus="jsImagesPreview('/images/no_img.jpg','image5')">


<img id="image5" width="120"
height="89" border="0" style="BORDER-RIGHT: #000000
1px solid; BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM:
#000000 1px solid">

</form>

Posted by [czar]
,
Photo 게시판 짤때 쓰던 이미지 미리 보기 Tip 한개 올립니다.

<body>안에 추가사항: <div id='preview' style='visibility=hidden; position:absolute; left:78px; top:165px; width:200px; height:62px; z-index:1; border-width:1px; border-style:none; filter:progid:DXImageTransform.Microsoft.Shadow(color=#4B4B4B,Direction=135,Strength=3);border-color:black;'></div>

image 태그에 mouse 이벤트만 주시면, 이쁜 옵져버(미리보기 ^^;;)가 나타 날 겁니다.

<a href = '#' onmousemove='setPreviewBox();' onmouseout='hidePreview(); return true;' onmouseover='showPreview("<img src = "+파일경로 +  URLEncoder.encode(파일명, "UTF-8") + " border = 0 width = 205 height = 154>";); return true;'> <img src = " + 파일경로 + URLEncoder.encode(파일명, "UTF-8") + " border = 0 width = 40 height = 30></a>

(URLEncoder를 사용하는 이유는 한글명 파일을 사용하기 위해서 입니다.  사이트 검색해보시면 상세한 이유를 아실 것이구요. 스크립트 덩치가 작아서 쉽게 이해 하실 겁니다.)

작은 이미지 적당한 크기로 미리보기 할 때 유용합니다. ^^*


자바스크립트 파일

function setPreviewBox(){
  preview.style.posLeft = event.x + 30 + document.body.scrollLeft;
  preview.style.posTop = event.y - 30 + document.body.scrollTop;
}

function showPreview(content){
  if(content!="")
  {
   var text;
   text ='<table cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" border-style:solid;">';
   text += '<tr align = center><td>' + content + '</td></tr></table>';
   preview.innerHTML=text;
   preview.style.visibility='visible';
  }
}

function hidePreview(){
  preview.innerHTML='';
  preview.style.visibility='hidden';
}

Posted by [czar]
,

고종수...

카테고리 없음 2006. 12. 8. 18:02


정말 다시 꼭 돌아왔으면 합니다.

청담동에 가게 오픈했다고 하는데..
아직 28인데..
휴..

왜 내가. 이러는거지??

Posted by [czar]
,

디자이너 추천북마크

로고파일(AI)이 없어서 난감할때

찾으면 거의 있음

vectored logos

logotype free
logotypes
logothèque
findlogo
free logotypes
high quality football logos


logo inspiration

goodlogo!com

Posted by [czar]
,