1)
정확도..에 관한 이야기를 풀어볼 일이 있어서,
간이로 부동소수점 덧셈을 구현한 것 처럼 만들어봤습니다.



..

2)

<style>

input#v1_131227 { width:180px; padding-left:5px; }
input#v2_131227 { width:180px; padding-left:5px; }

</style>

limit <span id=limv_131227 ></span> <br><br>

value1 <input id=v1_131227 value="0"
  onblur=compute();
  onfocus=execCommand('selectAll');
  />
+ value2 <input id=v2_131227 value="0"
  onblur=compute();
  onfocus=execCommand('selectAll');
  />

<br><br>

= <span id=output_131227></span>

<script>
var
  compute
  , limit=1000
  ;

(function(){

function $(v) { return document.getElementById(v)||document.all[v]; }

var eev;

var
  v1=$('v1_131227'), v2=$('v2_131227'), output=$('output_131227'), limv=$('limv_131227');

limv.innerHTML=limit;

(function(){ // eev to edge & Limit value..

var
  v, vv, nv, nnv, e, ee;

vv=1;

e=5000;

do {

v=1/2; ee=0;
while (nnv=vv*v) {
  nv=nnv; v*=v; if (!(--e)) break;

  ee++;
  }

if (!e) break;

vv=nv;

} while (ee>0);


v=nv;
while (v) {
  nv=v; v/=2; if (!(--e)) break;
  }

// v1.value=nv; v2.value=5000-e;

eev=nv*limit;

}());

 

function add(vv1, vv2) { // return by limit & Bigger abs's adding simulate (just sampling..)
  var va1, va2;

  va1=vv1*(vv1>0?1:-1);
  va2=vv2*(vv2>0?1:-1);

  va1=(va1<va2)?va2:va1;
 
  if (va1==0) vv1=0;
  else vv1=(vv1/va1*eev+vv2/va1*eev)*va1/eev;

  return vv1;
}

 

compute=function(){
  var vv1, vv2;

  vv1=v1.value*1; vv2=v2.value*1;
  vv1=isNaN(vv1)?0:vv1; vv2=isNaN(vv2)?0:vv2;

  output.innerHTML=add(vv1, vv2);

  };


}());
</script>


-- 새창에 띄우기 --

..

3)


limit

value1 + value2

=


..

4)
한계점 단계를 1000 으로 잡고, (limit)

절대값의 최대치를 (va1, va2 -> va1)
"극빈값(엡실론 http://ko.wikipedia.org/wiki/%CE%95 ..이라고 하던가요..?) * 한계점단계"로 기준잡으면서 (eev=nv*limit)

덧셈 마무리하고, 절대값만큼 다시 부풀려 값을 되돌립니다. (vv1=(..)*va1/eev)

5)
그렇게 시뮬레이션(?)하다보니 기존 방법의 상상(?)과는 달리,
큰 값을 기준으로만 한계점에 영향을 받고, 나머지 값은 그냥 유야무야 하더라구요.

오차를 조절(?)할 수 있겠지만,
소수점 위치와 값을 따로 처리하는(상상입니다..) 실제 부동소수점 형태와는 많이 다를겁니다.

..

wantHate killofki@.






Posted by killofki
,



metaLoader