没有浮点或双变量的浮点异常

Posted

技术标签:

【中文标题】没有浮点或双变量的浮点异常【英文标题】:Floating Point Exception with no float or double variable 【发布时间】:2018-03-15 14:36:18 【问题描述】:

我遇到以下代码“浮点异常,核心转储”的问题,但我什至没有一个浮点或双变量。通过检查 printf,我观察到它发生在 isPrimeFunction 中,执行卡住了。

/*
PROBLEM 3
The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?
*/


#include <stdio.h>

typedef int bool;
const bool true=1;
const bool false=0;

bool isPrime(long long int number) 
    long long int i;
    for(i=2; i < (number/2); i++) 
        if(number%i == 0) 
            return false;
        
    
    return true;
   

int main() 
    long long int number, largest;
    number=600851475143;
    largest=0;
    int i;

    for(i=1; i <= (number/2); i++) 
        if((number % i) == 0) 
            if(isPrime(i) == true) 
                largest=i;
            
        
    
    if(largest != 0)    
        printf("Largest prime factor is: %lli\n", largest);
    else
        printf("There is no prime factor of the number.\n");    

    return 0;

【问题讨论】:

不相关但您的 long long 值之后不需要 L 吗? 你的 main() 中的 i 不是应该是 long long int 而不是 int 吗? 实际上它是供用户输入的,但为了测试,我输入了 12 位数字。如果我输入第一个数字,结果与 29 完全相同。 可能不相关,但您的代码效率极低。即使它工作得很好,也需要很多年才能产生产出。 main() 中的循环迭代 3000 亿次,isPrime() 中的循环平均迭代 1500 亿次。如果我错了,请纠正我,但在你的程序完成之前不是 4.5 quintillion 迭代吗? Fister 姐姐,GCC 编译器 5.4 && Core 2 du inside && 64 位操作系统 【参考方案1】:

main 中,您的i 是一个int,因此很可能不足以容纳number/2,这意味着i 很可能(尽管这是未定义的行为)将包装并最终成为0. number % i 将导致除以零,这是另一种未定义的行为,但很可能是您的系统生成浮点异常的原因(我的)。

注意这不是一个很好的算法。只要数一数你会循环多少次。使用像 6000 亿这样的数字,即使它是素数,并且您永远不会在循环内触发 isPrime 测试,您正在查看接近一个小时的运行时间。每次您在循环内进行测试时,您的运行时间都会大大增加。

【讨论】:

以上是关于没有浮点或双变量的浮点异常的主要内容,如果未能解决你的问题,请参考以下文章

可以将浮点(或双精度)设置为 NaN 吗?

python PyQt - 用于浮点或双值+测试的QSlider

python PyQt - 用于浮点或双值+测试的QSlider

以浮点或双精度形式获取字节值。

当没有浮点数据类型时,为啥这段代码会出现浮点异常?

Objective-C - 对 nan 进行浮点检查