/**
* Checks if adding/subtracting one to/from a number yields the correct result.
*
* @param number The number to test
* @return true if you can add/subtract 1, false otherwise.
*/
var canAddSubtractOneFromNumber = function(number) {
var numMinusOne = number - 1;
var numPlusOne = number + 1;
return ((number - numMinusOne) === 1) && ((number - numPlusOne) === -1);
}
//Find the highest number
var highestNumber = 3; //Start with an integer 1 or higher
//Get a number higher than the valid integer range
while (canAddSubtractOneFromNumber(highestNumber)) {
highestNumber *= 2;
}
//Find the lowest number you can't add/subtract 1 from
var numToSubtract = highestNumber / 4;
while (numToSubtract >= 1) {
while (!canAddSubtractOneFromNumber(highestNumber - numToSubtract)) {
highestNumber = highestNumber - numToSubtract;
}
numToSubtract /= 2;
}
//And there was much rejoicing. Yay.
console.log('HighestNumber = ' + highestNumber);
20条答案
按热度按时间k5hmc34c16#
为了安全
推理
我想我会很聪明,找到它的价值所在
x + 1 === x
以更务实的方式。我的机器每秒只能数1000万左右。。。因此,我将在28.56年后发布最终答案。
如果你不能等那么久,我敢打赌
你的大部分循环都不会运行28.56年
9007199254740992 === Math.pow(2, 53) + 1
有足够的证据吗你应该坚持
4294967295
那是Math.pow(2,32) - 1
以避免位移位的预期问题发现
x + 1 === x
:3xiyfsfu17#
jimmy的答案正确地表示连续javascript整数范围为-9007199254740992到9007199254740992(抱歉9007199254740993,您可能认为您是9007199254740993,但您错了!下面的演示或在jsfiddle中的演示)。
然而,没有一个答案能在程序上找到/证明这一点(除了coolaj86在其答案中提到的将在28.56年内完成的答案;),因此,这里有一种更有效的方法(准确地说,它的效率提高了28.559999968312年:),还有一把测试小提琴:
643ylb0818#
在javascript中,有一个数字叫做
Infinity
.示例:
这可能足以回答有关此主题的一些问题。
55ooxyrt19#
它是253==9 007 199 254 740 992。这是因为
Number
s以浮点形式存储在52位尾数中。最小值为-253。
这让一些有趣的事情发生了
也可能是危险的:)
进一步阅读:http://blog.vjeux.com/2010/javascript/javascript-max_int-number-limits.html
nbewdwxp20#
<=es5
参考文献: