2013-11-23 3 views
0
var inc = .001; 
    var z = new Array(1.0/inc); 
    for (var x = 0.0; x < 1.0; x += inc) { 
    z.push(Math.cos(x)); 
    } 
    var y = new Array(1.0/inc); 
    for (x = 0.0; x < 1.0; x += inc) { 
    y.push(1 - ((x * x)/2) + ((x * x * x * x)/24)); 
    } 
    var sum = 0; 
    for (var i = 0; i < (1.0/inc); i++) { 
    sum += y[i] - z[i]; 
    } 
    console.log(sum); 
    console.log(sum/(1.0/inc)); 

Я довольно новичок в Javascript, но массивы здесь заполнены поплавками, и когда я беру разницу и пытаюсь их распечатать, он возвращает NaN. Я здесь. Вот скрипка с кодом (http://jsfiddle.net/2v7wu/). Благодаря!Почему я получаю NaN здесь, когда я просто получаю доступ к массиву?

+0

объясните, что вы ожидаете 'var z = new Array (1.0/inc);' для генерации .... он создает aarray с 1000 elemtns, которые не определены. Tru 'console.log (z)' сразу после его объявления. сомневайтесь, что вы хотели сделать – charlietfl

+0

@charlietfl: Расширение, 1000 записей. –

ответ

3

Вы создаете массивы, которые состоят из 1000 пустых значений, а затем нажимают на них дополнительные элементы. Ваши массивы в конечном итоге 2000 элементов длиной, из которых вы перебирать первый (пустой) 1000.

Вам не нужно объявлять длину массивов Javascript, поэтому только с помощью

var z = [] 
var y = [] 

будет хорошо.

Наконец, вам необходимо изменить свой индекс массива в последнем цикле для

sum += y[i] - z[i]; 
+0

Я думаю, что здесь также возникает проблема с тем, как javascript делает числа с плавающей запятой. Я уверен, что ваши суммы не будут такими, какие вы хотите – dbarnes

+0

Возможно, но они не будут 'NaN' по крайней мере – Gareth

+0

@Gareth: Я не знаю, о чем я думал, конечно,' a.push (значение) 'в основном' a [a.length] = значение'. Но важно понять, что это не то, что другие записи «пустые», это то, что они вообще не существуют * (потому что это не массивы). 'var a = new Array (3); a.push ("x"); 'дает вам массив с ** одной ** записью и' length' of '4'. –

2

Поскольку вы используете x где вы имеете в виду использовать i:

for (var i = 0; i < (1.0/inc); i++) { 
    sum += y[x] - z[x]; 
    //  ^------^--------- these should be i, not x 
} 

Смотрите также Gareth's point below, которая относится к моей ниже примечание стороны # 2. Начав с начальной длины, а затем используя push, вы не ставите вещи, где вы думаете. :-)


два примечания:

  1. Вы постоянно пересматривают 1.0/inc. Я рекомендую сделать это один раз и сохранить его в переменной.

  2. В JavaScript редко существует никаких причин для написания new Array(length). Просто используйте var z = []; и var y = []; Эти массивы aren't really arrays at all, и они будут «расти» по мере необходимости (но опять же, без большого количества перераспределений памяти, потому что они не являются массивами).

0

В вашем третьем цикле, вы пытаетесь использовать значение x с плавающей запятой в качестве индекса в y и z. В результате получается результат undefined, а undefined - undefined - NaN.

Предположительно, вы хотели использовать i в качестве индекса.

Смежные вопросы