越接近其最大分配值,加法越慢

  • 本文关键字:分配 接近 javascript math
  • 更新时间 :
  • 英文 :


好的,这个问题将不得不用一些伪代码可视化,所以我们开始:

假设我有 2 个整数,一个是变量,另一个是常量。

这样说:

int current = 0; static int max = 20

考虑到这一点,我怎么加得更慢,越接近 20,所以基本上它永远不会真正达到 20。 下面是一个示例:

假设添加 2 需要 3 秒 但是在前一个 2 之后添加相同的 2 需要两倍的时间,依此类推。

我会怎么做,对不起,如果很难理解,但我尽力了:(

谢谢,祝你有美好的一天!

一个可以玩的例子。

function progressiveInterpolatorThatNeverReachesTheEnd(rate, speed){
speed = +speed || 1;
var start = Date.now();

return function(a, b){
var time = (Date.now() - start);
var t = Math.pow(1-rate, time * speed/1000);
	
return a*t + b*(1-t);
}
}
var start = Date.now();
var interpolate = progressiveInterpolatorThatNeverReachesTheEnd(1/16, 1/10);
var output = document.getElementById("output");
function update(){
var a = 0, b = 100, c = interpolate(a, b);
output.innerHTML = a + " .. " + Math.floor(c) + " .. " + b + "<br> actually: " + c + "<br>runtime: " + (Date.now() - start)/1000 + "s";
requestAnimationFrame(update);
//or
//setTimeout(update, Math.random() * 500); 
//because update interval doesn't matter
}
update();
<div id="output"></div>

实际上,由于 JS 中 Numbers 的精度有限,这段代码最终会到达终点。

您可以使用公式

A = Pert

其中A是结果金额;P是启动校长;e是数学无理常数e,自然对数的底数,通常称为欧拉数,大约2.718281828459045;r利率是小数;t是以年为单位的时间,通常除以360

假设起始本金为0,结果将是0,因为没有利息可以产生0的本金。我们可以从.01的名义值开始,然后将新本金设置为应计利息添加到先前本金的结果。

javascript可以使用do..while循环来生成新的主体,在这里,我们以起始速率的一半停止循环,或者.05/2do..while循环中创建一个立即调用函数表达式来传递当前主体,推送一个在currentcurrent * duration后返回Promise的函数, 其中duration是正整数,利用Array.prototype.reduce()调用函数,该函数按顺序返回Promise,将下一个setTimeout的持续时间增加currentcurrent * duration

您还可以将公式调整为Math.exp(r * (t/n))

A = Per(t/n)

例如,n可以是360,以.05的利率从本金1连续复利,执行do..while循环360次,一个财政年度;这将在1之间产生更多的总结果,即15%的比率连续复利1年,其中最大可能的结果将是1.0512710963760241, 应计利息总额为.0512710963760241

1传递给compound函数将返回1.0512710963760241

var current = 0; // principal
var max = 20; // maturity, in years
var rate = .05; // annual rate as decimal
var time = 1; // time in years, alternatively `1/360`
var N = 360; // fiscal year
var arr = []; // store functions which return a `Promise`
var duration = 500;
var output = document.querySelector("output");
function compound(p, r, t) {  
return ((p||.01) * Math.exp(r * t)); // or `Math.exp(r * (t/N))` 
}
do {
current = compound(current, rate, time);
(function(curr) {
arr.push(
function() {
return new Promise(function(resolve) {
setTimeout(function() {
output.innerHTML += `current principal: ${curr}<br>`;
resolve();
}, curr * duration)
})
}
)
})(current)
} while (current < max - (rate / 2));
arr.reduce(function(promise, next) {
return promise.then(next)
}, Promise.resolve())
.then(function() {
output.innerHTML += `<br>max - current: ${max - current}`; 
});
<output></output>

相关内容

最新更新