循环函数向变量添加不准确的值,并且在跟踪代码时未定义数组。怎么修?

Posted

技术标签:

【中文标题】循环函数向变量添加不准确的值,并且在跟踪代码时未定义数组。怎么修?【英文标题】:Loop function adding inaccurate values to variables, and array is undefined when tracing the code. How to fix? 【发布时间】:2020-02-28 12:43:06 【问题描述】:

我在 ACS3 中进行了弹丸运动模拟,其中一个功能涉及创建一个多维数组,该数组在给定输入角度和速度的情况下绘制时间与球的高度。

当我跟踪这些值时,'t' 变量应该有 0.1 的增量,但是,在某些情况下,它给了我近似值(例如,它给了我 0.7999999 而不是 0.8...)。此外,数组的值是'undefined'。

我不知道还有什么可以尝试的,因为如果循环中的变量是 t = t + 0.1;,那么它不应该显示任何近似值。

我还尝试添加 velocity*Math.sin(angle/(180/Math.PI)) 而不是 vy(y 速度分量)。

shoot.addEventListener(MouseEvent.CLICK, Calculate);

function Calculate(event:MouseEvent):void

var t = 0;
var position:Array = new Array();

var vy = velocity*Math.sin(angle/(180/Math.PI));
var Time = int(((2*vy)/9.81)*100)/100
    time_txt.text = Time;

while (t <= Time)

    position[t]= (vy*t)-4.905*(t*t);
    t = t + 0.1;
    trace(t);
    trace(position[t]);




我希望控制台打印正确的时间间隔 (0.1,0.2,0.3...) 以及计算出的位置值,而不是“未定义”(基于 SUVAT 方程)。所以预期的结果应该是这样的:

0.1

(在时间 0.1 计算的位置)

0.2

(在时间 0.2 计算的位置)

0.3

(在时间 0.3 计算的位置)

...并继续,直到变量“t”大于计算“时间”。

相反,我得到:

0.1

未定义

0.2

未定义

0.30000000000000004 // 底线是......这是怎么回事?

undefined // 还是这个?

0.4

未定义

0.5

未定义

0.6

未定义

0.7

未定义

0.7999999999999999

未定义

0.8999999999999999

未定义

等等……

【问题讨论】:

Is floating point math broken?的可能重复 你从不定义 角度 所以结果也是未定义的。 【参考方案1】:

当我跟踪这些值时,'t' 变量应该有 0.1 的增量,但是,在某些情况下,它给了我近似值(例如,它给了我0.8,而不是0.8.. .).

另外,数组的值为undefined

这是一个可测试的示例代码,可能有助于解决您的问题。它在做你想做的事吗?

function Calculate(event:MouseEvent):void


    var velocity :int = 4; //temp for testing
    var angle :int = 45; //temp for testing
    
    var t :Number = 0;
    var position :Array = new Array();
    var pos_idx :int = 0; //your position within the array
    
    var vy = velocity*Math.sin(angle/(180/Math.PI));
    
    //var Time = int(((2*vy)/9.81)*100)/100
    var Time :Number = 6.5; //temp small value for testing
    
    time_txt.text = Time;
    
    while(t <= Time)
    
        position[ pos_idx ] = (vy * t) - 4.905 * (t * t);
        trace("position[" + pos_idx + "]: " + position[ pos_idx ] );
        
        t += 0.1;
        t = Number( t.toFixed(3) ); //rounding down the fraction part
        trace("t is: " + t);
        
        pos_idx += 1; //add +1 for next position within array
    


关于您的问题:

(1) 数组位置是 "undefined" 问题是因为数组的位置是整数而不是分数。数组表示“事物组”(事物1、事物2、事物3 等),例如,如果您的事物是门,那么您可以查看Door #1Door #2,但如果您尝试查看@987654328,编译器将失败@。

(2) 在编程语言中,整数是整数(使用NumberFloatLong 表示分数)。

您的代码var Time :int = int( ((2*vy)/9.81) * 100) / 100; 的结果可能是(例如:当angle 为45 时)因为((2*vy)/9.81) * 100) / 100; 的结果是0.5766416156465218 但如果您将其转换为int 然后小数部分现在被忽略,因此它向下舍入为0 的结果。

(3) PS:在长时间运行的While 循环中使用跟踪时要小心。如果您的应用程序必须在每个循环中报告 trace,这可能会暂时冻结您的应用程序。 Time 越大,冻结时间越长。

【讨论】:

谢谢!它似乎已经解决了这个问题。

以上是关于循环函数向变量添加不准确的值,并且在跟踪代码时未定义数组。怎么修?的主要内容,如果未能解决你的问题,请参考以下文章

VBA Excel 2016 中未定义子或函数

在 Java 中“追踪”某些东西是啥意思?

Golang tips ----- 函数

让不显示变量的值

核心位置的准确性

如何准确解码 ProGuard 的混淆代码?