Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Fibonacci-elapsedTime();公式_Java - Fatal编程技术网

Java Fibonacci-elapsedTime();公式

Java Fibonacci-elapsedTime();公式,java,Java,我正在为斐波那契算法做一个小项目 我使用下面的方法来计算算法。请注意,elapsedTime()返回一个double public static void fibonacciSequence(long n1, long n2) { t0 = stopwatch.elapsedTime(); System.out.print("index: " + index + " -> " + n1 + "\t"); t1 = stopwatch.elapsedTime();

我正在为斐波那契算法做一个小项目

我使用下面的方法来计算算法。请注意,
elapsedTime()
返回一个
double

public static void fibonacciSequence(long n1, long n2) {

    t0 = stopwatch.elapsedTime();
    System.out.print("index: " + index + " -> " + n1 + "\t");
    t1 = stopwatch.elapsedTime();
    lapTime = (1000 * t1 - 1000 * t0) / 1000;
    StdOut.println(" (" + lapTime + "\t " + t1 + ")");

    if (index == stoppingPoint) {
        return;
    }
    index++;
    fibonacciSequence(n2, n1 + n2);
}
现在不要太关注算法本身——它会被修复的。我只是不懂lapTime的公式。为什么不能呢

lapTime = t1-t0; 
应该是的

就你而言:

(1000 * t1 - 1000 * t0) / 1000 == (t1 - t0) * 1000 / 1000 == t1 - t0
因此,编写
lapTime=t1-t0
是一个好主意,因为它使代码更容易理解

此外,您还可以通过不再乘以
1000
来避免溢出
long
的风险。

这属于来自的类。此类用于测量算法的执行时间。实现如下(删除注释和此类数据):

由于它使用的是
System.currentTimeMillis()
,因此它将以毫秒为单位工作。但是
elapsedTime
方法已经将它转换回秒,但是作为
double
。因此,您当前的公式:

lapTime = (1000 * t1 - 1000 * t0) / 1000;
lapTime = t1 - t0;
确保将数据转换为纯
double
操作。因此,公式可以改写为:

lapTime = t1 - t0;
没问题

请注意,这仍然不是测量Java代码执行时间的正确方法。你应该改用

更多信息:


为了深入了解这些操作之间是否没有区别,让我们创建一个基本测试:

public class FormulaTest {
    static double formula1(double t0, double t1) {
        return (1000 * t1 - 1000 * t0) / 1000;
    }

    static double formula2(double t0, double t1) {
        return t1 - t0;
    }

    static void printResults(double t0, double t1) {
        System.out.println("t0: " + t0);
        System.out.println("t1: " + t1);
        System.out.println("Formula1: " + formula1(t0, t1));
        System.out.println("Formula2: " + formula1(t0, t1));
        System.out.println("---------------------------------------------------");
    }

    public static void main(String[] args) throws java.lang.Exception {
        // your code goes here
        printResults(0, 10);
        printResults(System.currentTimeMillis(), System.currentTimeMillis());
        printResults(System.currentTimeMillis(), System.currentTimeMillis() + 142);
        printResults(1.7976931348623157e+300 - 5000, 1.7976931348623157e+300);
        printResults(
            109999999999999999999999999999999999999999999999999999999999999999999999.0,
            119999999999999999999999999999999999999999999999999999999999999999999999.0);
        printResults(
            10.9999999999999999999999999999999999999999999999999999999999999999999999,
            11.9999999999999999999999999999999999999999999999999999999999999999999999);
        printResults(
            823145321462149234.651985149616914621346234923149621346921394613293423951932415934159213226314,
            844329146321496321.532159341563149513495139159341593415793415431951349513891585443951391593151);
        printResults(
            82314532.1462149234651985149616914621346234923149621346921394613293423951932415934159213226314,
            84432914.6321496321532159341563149513495139159341593415793415431951349513891585443951391593151);
        printResults(1.7976931348623157e+307, 4.9e-323);
        printResults(Double.MAX_VALUE, Double.MAX_VALUE);
        printResults(Double.MIN_VALUE - 10, Double.MIN_VALUE);
    }
}
输出:

t0: 0.0
t1: 10.0
Formula1: 10.0
Formula2: 10.0
---------------------------------------------------
t0: 1.410290897577E12
t1: 1.410290897577E12
Formula1: 0.0
Formula2: 0.0
---------------------------------------------------
t0: 1.410290897577E12
t1: 1.410290897719E12
Formula1: 142.0
Formula2: 142.0
---------------------------------------------------
t0: 1.7976931348623156E300
t1: 1.7976931348623156E300
Formula1: 0.0
Formula2: 0.0
---------------------------------------------------
t0: 1.1E71
t1: 1.2E71
Formula1: 9.999999999999985E69
Formula2: 9.999999999999985E69
---------------------------------------------------
t0: 11.0
t1: 12.0
Formula1: 1.0
Formula2: 1.0
---------------------------------------------------
t0: 8.2314532146214925E17
t1: 8.4432914632149632E17
Formula1: 2.1183824859347024E16
Formula2: 2.1183824859347024E16
---------------------------------------------------
t0: 8.231453214621492E7
t1: 8.443291463214964E7
Formula1: 2118382.4859347227
Formula2: 2118382.4859347227
---------------------------------------------------
t0: 1.7976931348623158E307
t1: 4.9E-323
Formula1: -Infinity
Formula2: -Infinity
---------------------------------------------------
t0: 1.7976931348623157E308
t1: 1.7976931348623157E308
Formula1: NaN
Formula2: NaN
---------------------------------------------------
t0: -10.0
t1: 4.9E-324
Formula1: 10.0
Formula2: 10.0
---------------------------------------------------
即使是在边缘情况下也不例外。
Double.MAX_值
Double.MIN_值
是公式结果之间的差异。即使结果是
-无穷大
NaN
(不是数字)

简而言之:使用最后一个公式:

lapTime = (1000 * t1 - 1000 * t0) / 1000;
lapTime = t1 - t0;

您用于计算变量
lapTime
的表达式可以简化,并且您已经发布了它可能具有的最简单表示形式

lapTime = (1000 * t1 - 1000 * t0) / 1000; 
可以改为:

lapTime = t1 - t0;
这可以通过简单的代数来确定。考虑到
t1
t0
double
,这两个表达式甚至可能产生不同的值,即使它们在数学上相等



对于您试图解决的问题,测量Java程序的执行时间。以下是我在使用微观基准进行测量方面的经验,我最终认为这是一次失败

elapsedTime()返回什么---表示以毫秒/秒或秒为单位的数据类型和时间???答案就藏在这里面!你可以用你的公式。这是正确的。也许这与从double到int的转换有关?我对编程还不熟悉,但我发现这是一个返回的双秒。通过这种方式,输入/1000是有意义的,因为大多数值都是0.001-0.005。谢谢@dz3k如果它是
double
类型,那是因为您使用的是
double
类型。一个更简单的替代方法是使用
long t0=System.currentTimeMillis()
。顺便问一下,你为什么要计算打印报表所需的时间?您意识到计算量不到您的方法所做工作的千分之一。因为答案与问题不同步,而且答案是糟糕的摘要@Jeanlogart也许你可以在解释中使用
-
而不是
+
。@Jeanlogart看到了Luiggi的答案。@PeterLawrey-我怀疑这个答案是如何被提升3次的,检查Luiggi的答案!我不敢相信你竟然支持这个答案@shekharsuman认为Luggi的解释毫无意义,我看不出它是如何被提升的。+0“确保将数据转换为纯整数运算。”这并不是将
double
转换为
int
long
即使你的答案是错误的,也不能假定t0和t1的数据类型为
long
,除非OP澄清!我把我的票改成a-1给你!您已经演示了
t0
t1
必须是
double
,请参阅
double elapseTime()
不是
long
,如果是
long
乘以1000不会有任何区别。因为它是
double
执行
1000*
仍然是一个double。注意:我怀疑原始作者可能有意让它“确保将数据转换为纯长操作”,但实际上并没有这样做。没有看到这一点,这是有意义的,谢谢@Luiggimendoza您的答案是正确的,但如果涉及到int、double等其他数据类型,您的解释可能不正确。因此,您不应该指出与
简单代数相关的点!另外,请查看我的答案,以获得更多信息@shekharsuman如前所述,如果不澄清数据类型,任何答案都不可能100%绝对正确。关于基础数学的观点是有效的,尤其是在使用浮点值时。实际上,OP将数据类型作为双类型作为
elaapsedTime()
方法的返回类型!你必须检查OP问题下面的评论!编辑问题的要点很好!请相应修改您的答案,我将更新您的答案!请删除与浮点相关的那个点,因为时间是有界的,永远不会像
0.333…
。。。我已经提到你的答案似乎是正确的,但浮点条件不适合这个问题。