| /* |
| * Copyright (C) 2007 Apple Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY |
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| var loops = 3500 |
| var nx = 120 |
| var nz = 120 |
| |
| function morph(a, f) { |
| var PI2nx = Math.PI * 8/nx |
| var sin = Math.sin |
| var f30 = -(50 * sin(f*Math.PI*2)) |
| |
| for (var i = 0; i < nz; ++i) { |
| for (var j = 0; j < nx; ++j) { |
| a[3*(i*nx+j)+1] = sin((j-1) * PI2nx ) * -f30 |
| } |
| } |
| } |
| |
| |
| var a = Array() |
| for (var i=0; i < nx*nz*3; ++i) |
| a[i] = 0 |
| |
| for (var i = 0; i < loops; ++i) { |
| morph(a, i/loops) |
| } |
| |
| // This has to be an approximate test since ECMAscript doesn't formally specify |
| // what sin() returns. Even if it did specify something like for example what Java 7 |
| // says - that sin() has to return a value within 1 ulp of exact - then we still |
| // would not be able to do an exact test here since that would allow for just enough |
| // low-bit slop to create possibly big errors due to testOutput being a sum. |
| |
| var expectedResults = [ |
| { value: 0.018662099703860055, total: 0.018662099703860055 }, // 0 |
| { value: 0, total: 0.018662099703860055 }, // 1 |
| { value: -0.018662099703860055, total: 0 }, // 2 |
| { value: -0.03650857609997156, total: -0.03650857609997156 }, // 3 |
| { value: -0.05275945253292943, total: -0.08926802863290098 }, // 4 |
| { value: -0.06670448772225647, total: -0.15597251635515746 }, // 5 |
| { value: -0.07773421671447613, total: -0.23370673306963358 }, // 6 |
| { value: -0.08536658742611654, total: -0.3190733204957501 }, // 7 |
| { value: -0.08926802863290098, total: -0.40834134912865105 }, // 8 |
| { value: -0.089268028632901, total: -0.49760937776155206 }, // 9 |
| { value: -0.08536658742611655, total: -0.5829759651876686 }, // 10 |
| { value: -0.07773421671447614, total: -0.6607101819021447 }, // 11 |
| { value: -0.06670448772225651, total: -0.7274146696244013 }, // 12 |
| { value: -0.052759452532929435, total: -0.7801741221573307 }, // 13 |
| { value: -0.03650857609997158, total: -0.8166826982573023 }, // 14 |
| { value: -0.018662099703860093, total: -0.8353447979611625 }, // 15 |
| { value: -1.0992398059873222e-17, total: -0.8353447979611625 }, // 16 |
| { value: 0.018662099703860034, total: -0.8166826982573024 }, // 17 |
| { value: 0.036508576099971525, total: -0.780174122157331 }, // 18 |
| { value: 0.052759452532929414, total: -0.7274146696244015 }, // 19 |
| { value: 0.06670448772225647, total: -0.660710181902145 }, // 20 |
| { value: 0.0777342167144761, total: -0.5829759651876689 }, // 21 |
| { value: 0.08536658742611654, total: -0.4976093777615524 }, // 22 |
| { value: 0.08926802863290098, total: -0.4083413491286514 }, // 23 |
| { value: 0.089268028632901, total: -0.3190733204957504 }, // 24 |
| { value: 0.08536658742611655, total: -0.23370673306963383 }, // 25 |
| { value: 0.07773421671447615, total: -0.1559725163551577 }, // 26 |
| { value: 0.06670448772225653, total: -0.08926802863290116 }, // 27 |
| { value: 0.052759452532929435, total: -0.036508576099971726 }, // 28 |
| { value: 0.03650857609997163, total: -9.71445146547012e-17 }, // 29 |
| { value: 0.018662099703860107, total: 0.01866209970386001 }, // 30 |
| { value: 2.1984796119746444e-17, total: 0.01866209970386003 }, // 31 |
| { value: -0.018662099703859986, total: 4.5102810375396984e-17 }, // 32 |
| { value: -0.03650857609997152, total: -0.036508576099971476 }, // 33 |
| { value: -0.05275945253292941, total: -0.08926802863290088 }, // 34 |
| { value: -0.06670448772225643, total: -0.1559725163551573 }, // 35 |
| { value: -0.0777342167144761, total: -0.2337067330696334 }, // 36 |
| { value: -0.08536658742611652, total: -0.31907332049574993 }, // 37 |
| { value: -0.08926802863290098, total: -0.40834134912865094 }, // 38 |
| { value: -0.089268028632901, total: -0.49760937776155195 }, // 39 |
| { value: -0.08536658742611655, total: -0.5829759651876685 }, // 40 |
| { value: -0.07773421671447617, total: -0.6607101819021446 }, // 41 |
| { value: -0.06670448772225658, total: -0.7274146696244012 }, // 42 |
| { value: -0.05275945253292945, total: -0.7801741221573306 }, // 43 |
| { value: -0.03650857609997164, total: -0.8166826982573022 }, // 44 |
| { value: -0.018662099703860194, total: -0.8353447979611625 }, // 45 |
| { value: -3.2977194179619666e-17, total: -0.8353447979611625 }, // 46 |
| { value: 0.018662099703859975, total: -0.8166826982573024 }, // 47 |
| { value: 0.036508576099971435, total: -0.7801741221573311 }, // 48 |
| { value: 0.0527594525329294, total: -0.7274146696244017 }, // 49 |
| { value: 0.06670448772225643, total: -0.6607101819021453 }, // 50 |
| { value: 0.07773421671447606, total: -0.5829759651876691 }, // 51 |
| { value: 0.08536658742611652, total: -0.4976093777615526 }, // 52 |
| { value: 0.08926802863290097, total: -0.40834134912865167 }, // 53 |
| { value: 0.08926802863290101, total: -0.31907332049575066 }, // 54 |
| { value: 0.08536658742611655, total: -0.2337067330696341 }, // 55 |
| { value: 0.07773421671447617, total: -0.15597251635515794 }, // 56 |
| { value: 0.06670448772225658, total: -0.08926802863290136 }, // 57 |
| { value: 0.052759452532929456, total: -0.0365085760999719 }, // 58 |
| { value: 0.03650857609997165, total: -2.498001805406602e-16 }, // 59 |
| { value: 0.018662099703860208, total: 0.018662099703859958 }, // 60 |
| { value: 4.396959223949289e-17, total: 0.018662099703860003 }, // 61 |
| { value: -0.01866209970385996, total: 4.163336342344337e-17 }, // 62 |
| { value: -0.03650857609997142, total: -0.03650857609997138 }, // 63 |
| { value: -0.0527594525329294, total: -0.08926802863290079 }, // 64 |
| { value: -0.06670448772225641, total: -0.1559725163551572 }, // 65 |
| { value: -0.07773421671447604, total: -0.23370673306963324 }, // 66 |
| { value: -0.08536658742611652, total: -0.31907332049574977 }, // 67 |
| { value: -0.08926802863290097, total: -0.4083413491286507 }, // 68 |
| { value: -0.08926802863290101, total: -0.49760937776155173 }, // 69 |
| { value: -0.08536658742611655, total: -0.5829759651876683 }, // 70 |
| { value: -0.07773421671447618, total: -0.6607101819021445 }, // 71 |
| { value: -0.06670448772225658, total: -0.727414669624401 }, // 72 |
| { value: -0.05275945253292948, total: -0.7801741221573305 }, // 73 |
| { value: -0.036508576099971664, total: -0.8166826982573022 }, // 74 |
| { value: -0.018662099703860215, total: -0.8353447979611625 }, // 75 |
| { value: -5.496199029936611e-17, total: -0.8353447979611625 }, // 76 |
| { value: 0.01866209970385995, total: -0.8166826982573026 }, // 77 |
| { value: 0.036508576099971414, total: -0.7801741221573312 }, // 78 |
| { value: 0.05275945253292938, total: -0.7274146696244018 }, // 79 |
| { value: 0.0667044877222563, total: -0.6607101819021455 }, // 80 |
| { value: 0.07773421671447604, total: -0.5829759651876695 }, // 81 |
| { value: 0.08536658742611652, total: -0.49760937776155295 }, // 82 |
| { value: 0.08926802863290097, total: -0.408341349128652 }, // 83 |
| { value: 0.08926802863290101, total: -0.319073320495751 }, // 84 |
| { value: 0.08536658742611655, total: -0.23370673306963444 }, // 85 |
| { value: 0.07773421671447626, total: -0.1559725163551582 }, // 86 |
| { value: 0.0667044877222566, total: -0.08926802863290159 }, // 87 |
| { value: 0.05275945253292948, total: -0.036508576099972115 }, // 88 |
| { value: 0.036508576099971816, total: -2.983724378680108e-16 }, // 89 |
| { value: 0.018662099703860225, total: 0.018662099703859927 }, // 90 |
| { value: 6.595438835923933e-17, total: 0.018662099703859993 }, // 91 |
| { value: -0.018662099703859788, total: 2.0469737016526324e-16 }, // 92 |
| { value: -0.0365085760999714, total: -0.0365085760999712 }, // 93 |
| { value: -0.052759452532929366, total: -0.08926802863290056 }, // 94 |
| { value: -0.06670448772225629, total: -0.15597251635515685 }, // 95 |
| { value: -0.07773421671447604, total: -0.2337067330696329 }, // 96 |
| { value: -0.08536658742611652, total: -0.31907332049574944 }, // 97 |
| { value: -0.08926802863290095, total: -0.4083413491286504 }, // 98 |
| { value: -0.08926802863290101, total: -0.4976093777615514 }, // 99 |
| { value: -0.08536658742611657, total: -0.5829759651876679 }, // 100 |
| { value: -0.07773421671447626, total: -0.6607101819021441 }, // 101 |
| { value: -0.06670448772225661, total: -0.7274146696244007 }, // 102 |
| { value: -0.052759452532929484, total: -0.7801741221573302 }, // 103 |
| { value: -0.03650857609997182, total: -0.816682698257302 }, // 104 |
| { value: -0.01866209970386024, total: -0.8353447979611622 }, // 105 |
| { value: -7.694678641911255e-17, total: -0.8353447979611623 }, // 106 |
| { value: 0.018662099703859774, total: -0.8166826982573026 }, // 107 |
| { value: 0.0365085760999714, total: -0.7801741221573312 }, // 108 |
| { value: 0.05275945253292936, total: -0.7274146696244018 }, // 109 |
| { value: 0.06670448772225629, total: -0.6607101819021455 }, // 110 |
| { value: 0.07773421671447603, total: -0.5829759651876695 }, // 111 |
| { value: 0.08536658742611652, total: -0.49760937776155295 }, // 112 |
| { value: 0.08926802863290095, total: -0.408341349128652 }, // 113 |
| { value: 0.08926802863290101, total: -0.319073320495751 }, // 114 |
| { value: 0.08536658742611657, total: -0.2337067330696344 }, // 115 |
| { value: 0.07773421671447626, total: -0.15597251635515813 }, // 116 |
| { value: 0.06670448772225661, total: -0.08926802863290152 }, // 117 |
| { value: 0.0527594525329295, total: -0.036508576099972025 }, // 118 |
| { value: 0.03650857609997184, total: -1.8735013540549517e-16 }, // 119 |
| ]; |
| |
| var valueError = 0.00000000000001; |
| var totalError = 0.0000000000001; |
| |
| function expect(i, value, total) { |
| var data = expectedResults; |
| var valueDiff = Math.abs(value - data[i].value); |
| var totalDiff = Math.abs(total - data[i].total); |
| |
| var err = null; |
| if (valueDiff > valueError && totalDiff > totalError) |
| err = " [" + i + "] value a:" + value + " e:" + data[i].value + " | d:" + valueDiff + ", total a:" + total + " e:" + data[i].total + " | d: " + totalDiff; |
| else if (valueDiff > valueError) |
| err = " [" + i + "] value a:" + value + " e:" + data[i].value + " | d:" + valueDiff; |
| else if (totalDiff > totalError) |
| err = " [" + i + "] total a:" + total + " e:" + data[i].total + " | d: " + totalDiff; |
| |
| if (err) |
| throw err; |
| } |
| |
| testOutput = 0; |
| for (var i = 0; i < nx; i++) { |
| var value = a[3*(i*nx+i)+1]; |
| testOutput += value; |
| expect(i, value, testOutput); |
| } |
| a = null; |