找回密码
 欢迎注册
查看: 8109|回复: 5

[提问] 由C语言的判断是否为素数所想到的问题

[复制链接]
发表于 2010-10-19 16:29:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
由C语言的判断是否为素数所想到的问题
C语言有一个快速判断是否素数的计算方法:
  1. BOOL IsPrime(DWORD dwData)
  2. {
  3.     DWORD dwMax;
  4.     DWORD i;
  5.     BOOL bPrime = FALSE;

  6.     if (dwData < 2)
  7.         goto Label_End;

  8.     dwMax = sqrt(dwData);
  9.     for (i = 2, bPrime = TRUE; i <= dwMax; i++) {
  10.         if (dwData % i == 0) {
  11.             bPrime = FALSE;
  12.             break;
  13.         }
  14.     }

  15.         Label_End:
  16.     return bPrime;
  17. }
复制代码
这里的问题就在于dwMax,因为浮点数存储DWORD转换过来的值的时候,可能被转换成一个最近的double类型的浮点数,然后求了平方根以后,又转换成整数。
这个过程就存在了失真,是否有存在这种情况: dwMax所求出来的值满足如下条件:(dwMax+1)*(dwMax+1) <= dwData的情况?如果存在这种情况,那么这个判断素数的算法就有问题了。
望大家的解答!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-10-19 16:35:27 | 显示全部楼层
这段代码应该存在问题,当dwData恰好为完全平方数时,dwMax可能会比理论值小1,
对于浮点数转整数,通常要加0.5。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-10-19 16:37:57 | 显示全部楼层
这段代码应该存在问题,当dwData恰好为完全平方数时,dwMax可能会比理论值小1,
对于浮点数转整数,通常要加0.5。
gxqcn 发表于 2010-10-19 16:35


果然独到啊!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-10-19 16:46:44 | 显示全部楼层
我为了避免这类问题,HugeCalc 就没调用任何浮点算法库,这样心里踏实些,感觉也更快。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-10-19 16:53:43 | 显示全部楼层
我为了避免这类问题,HugeCalc 就没调用任何浮点算法库,这样心里踏实些,感觉也更快。
gxqcn 发表于 2010-10-19 16:46


是的,似乎一般写程序人员都是做能够100%确定的事情!谢谢您的解答!对我收益很大!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-10-25 08:56:30 | 显示全部楼层
用圆整,而不是取整才好
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-6 12:49 , Processed in 0.047693 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表