wip
This commit is contained in:
parent
c3c5968749
commit
c5a62cfa1d
3 changed files with 95 additions and 5 deletions
13
fixed.js
13
fixed.js
|
@ -17,11 +17,11 @@ let bytes = Math.ceil(bits / 8) * entries;
|
||||||
let epsilonBits = 1 ;
|
let epsilonBits = 1 ;
|
||||||
let epsilon = 2 ** epsilonBits;
|
let epsilon = 2 ** epsilonBits;
|
||||||
|
|
||||||
function toFixed(float) {
|
export function toFixed(float) {
|
||||||
return Math.round(float * base);
|
return Math.round(float * base);
|
||||||
}
|
}
|
||||||
|
|
||||||
function toFloat(fixed) {
|
export function toFloat(fixed) {
|
||||||
return fixed / base;
|
return fixed / base;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,12 +48,12 @@ for (let i = 0; i < entries * 2; i++) {
|
||||||
|
|
||||||
|
|
||||||
// returns fixed point
|
// returns fixed point
|
||||||
function log2(fixed) {
|
export function log2(fixed) {
|
||||||
return enloggen[toIndex(fixed)];
|
return enloggen[toIndex(fixed)];
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns rounded integer
|
// returns rounded integer
|
||||||
function pow2(fixed) {
|
export function pow2(fixed) {
|
||||||
let n = toIndex(fixed);
|
let n = toIndex(fixed);
|
||||||
if (n > empower.length) {
|
if (n > empower.length) {
|
||||||
n = empower.length - 1;
|
n = empower.length - 1;
|
||||||
|
@ -61,7 +61,7 @@ function pow2(fixed) {
|
||||||
return empower[entries + n];
|
return empower[entries + n];
|
||||||
}
|
}
|
||||||
|
|
||||||
function mul(a, b) {
|
export function mul(a, b) {
|
||||||
if (a == 0) return 0;
|
if (a == 0) return 0;
|
||||||
if (b == 0) return 0;
|
if (b == 0) return 0;
|
||||||
let la = log2(a)|0;
|
let la = log2(a)|0;
|
||||||
|
@ -93,6 +93,7 @@ for (let i = 0; i < powEntries; i++) {
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
// now just try multipling numbers
|
// now just try multipling numbers
|
||||||
let deltas = 0;
|
let deltas = 0;
|
||||||
let deltaAvg = 0;
|
let deltaAvg = 0;
|
||||||
|
@ -153,3 +154,5 @@ for (let i = 0; i < enloggen.length; i++) {
|
||||||
m = Math.max(m, enloggen[i]);
|
m = Math.max(m, enloggen[i]);
|
||||||
}
|
}
|
||||||
console.log(`max enloggen entry is ${m}`);
|
console.log(`max enloggen entry is ${m}`);
|
||||||
|
|
||||||
|
*/
|
22
sim.html
Normal file
22
sim.html
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Mandelbrot fixed-point test</title>
|
||||||
|
<style type="text/css">
|
||||||
|
/* */
|
||||||
|
</style>
|
||||||
|
<body>
|
||||||
|
<h1>Mandelbrot fixed-point test</h1>
|
||||||
|
|
||||||
|
<h2>Float</h2>
|
||||||
|
<canvas id="float" width="256" height="256"></canvas>
|
||||||
|
|
||||||
|
<h2>Fixed-point imul</h2>
|
||||||
|
<canvas id="imul" width="256" height="256"></canvas>
|
||||||
|
|
||||||
|
<h2>Fixed-point log</h2>
|
||||||
|
<canvas id="log" width="256" height="256"></canvas>
|
||||||
|
|
||||||
|
<script async type="module" src="sim.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
65
sim.js
Normal file
65
sim.js
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
import {toFixed, toFloat, mul} from './fixed.js';
|
||||||
|
|
||||||
|
let max = 256;
|
||||||
|
let width = 256;
|
||||||
|
let height = 256;
|
||||||
|
let zoom = 1;
|
||||||
|
|
||||||
|
let black = 0xff000000;
|
||||||
|
let tricolor = [
|
||||||
|
0xffff0000,
|
||||||
|
0xff00ff00,
|
||||||
|
0xff0000ff,
|
||||||
|
];
|
||||||
|
|
||||||
|
let palette = new Uint32Array(256);
|
||||||
|
palette[0] = black;
|
||||||
|
for (let i = 0; i < 255; i++) {
|
||||||
|
palette[i + 1] = tricolor[i % 3];
|
||||||
|
}
|
||||||
|
function nap() {
|
||||||
|
return new Promise((resolve) => setTimeout(() => resolve()));
|
||||||
|
}
|
||||||
|
|
||||||
|
async function setup(id, iterfunc) {
|
||||||
|
let canvas = document.getElementById(id);
|
||||||
|
let ctx = canvas.getContext('2d');
|
||||||
|
let imageData = ctx.createImageData(width, height);
|
||||||
|
let rgba = new Uint32Array(imageData.data.buffer);
|
||||||
|
for (let y = 0; y < height; y++) {
|
||||||
|
let cy = (y * 2 - height) / (height / 2);
|
||||||
|
for (let x = 0; x < width; x++) {
|
||||||
|
let cx = (x * 2 - width) / (width / 2);
|
||||||
|
let i = iterfunc(cx, cy);
|
||||||
|
let color = palette[i];
|
||||||
|
rgba[y * width + x] = color;
|
||||||
|
rgba[(256 - y) * width + x] = color;
|
||||||
|
|
||||||
|
if (x % 16 == 15) {
|
||||||
|
ctx.putImageData(imageData, 0, 0);
|
||||||
|
await nap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setup('float', (cx, cy) => {
|
||||||
|
let zx = 0;
|
||||||
|
let zy = 0;
|
||||||
|
let zx_2 = 0;
|
||||||
|
let zy_2 = 0;
|
||||||
|
let zx_zy = 0;
|
||||||
|
for (let i = 1; i < max; i++) {
|
||||||
|
zx = zx_2 - zy_2 + cx;
|
||||||
|
zy = zx_zy + zx_zy + cy;
|
||||||
|
zx_2 = zx * zx;
|
||||||
|
zy_2 = zy * zy;
|
||||||
|
zx_zy = zx * zy;
|
||||||
|
if (zx_2 >= 4 || zy_2 >= 4 || zx_2 + zy_2 >= 4) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}).then(() => {
|
||||||
|
console.log('done');
|
||||||
|
})
|
Loading…
Reference in a new issue