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 1000
value1 + value2
=
..
4)
한계점 단계를 1000 으로 잡고, (limit)
절대값의 최대치를 (va1, va2 -> va1)
"극빈값(엡실론 http://ko.wikipedia.org/wiki/%CE%95 ..이라고 하던가요..?) * 한계점단계"로 기준잡으면서 (eev=nv*limit)
덧셈 마무리하고, 절대값만큼 다시 부풀려 값을 되돌립니다. (vv1=(..)*va1/eev)
5)
그렇게 시뮬레이션(?)하다보니 기존 방법의 상상(?)과는 달리,
큰 값을 기준으로만 한계점에 영향을 받고, 나머지 값은 그냥 유야무야 하더라구요.
오차를 조절(?)할 수 있겠지만,
소수점 위치와 값을 따로 처리하는(상상입니다..) 실제 부동소수점 형태와는 많이 다를겁니다.
..
wantHate killofki@.
정확도..에 관한 이야기를 풀어볼 일이 있어서,
간이로 부동소수점 덧셈을 구현한 것 처럼 만들어봤습니다.
..
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 1000
value1 + value2
=
..
4)
한계점 단계를 1000 으로 잡고, (limit)
절대값의 최대치를 (va1, va2 -> va1)
"극빈값(엡실론 http://ko.wikipedia.org/wiki/%CE%95 ..이라고 하던가요..?) * 한계점단계"로 기준잡으면서 (eev=nv*limit)
덧셈 마무리하고, 절대값만큼 다시 부풀려 값을 되돌립니다. (vv1=(..)*va1/eev)
5)
그렇게 시뮬레이션(?)하다보니 기존 방법의 상상(?)과는 달리,
큰 값을 기준으로만 한계점에 영향을 받고, 나머지 값은 그냥 유야무야 하더라구요.
오차를 조절(?)할 수 있겠지만,
소수점 위치와 값을 따로 처리하는(상상입니다..) 실제 부동소수점 형태와는 많이 다를겁니다.
..
wantHate killofki@.
'image area' 카테고리의 다른 글
float] 힙을 이용한 정밀합산 시뮬레이션.. (0) | 2014.08.07 |
---|---|
image :area] css 적용을 해봤습니다. (0) | 2014.01.27 |
CSS3 :animation] transition & keyframe.. (0) | 2014.01.25 |
css:input] 한국민속촌 2014년 윷점 클릭으로 확대보기.. (0) | 2014.01.18 |
imageResize] 한줄에 있는 이미지 높이를 하나로 맞춰봅니다. (0) | 2013.12.09 |