目录
回复内容:
首页 后端开发 php教程 为什么负数的取余计算各个编程语言结果不统一?

为什么负数的取余计算各个编程语言结果不统一?

Jun 06, 2016 pm 04:42 PM

回复内容:

带符号整数的除法与余数 数学上都正确,这个定义本来就有好几个
比如按r = a - n\text{trunc}\left( a/n \right)
或者按r=a-n\left\lfloor{a/n}\right\rfloor
IEEE标准是则是r=a-n\text{round}\left(a/n\right) ,然而round标准也有好几个。。。
如果round是IEEE默认的round to the nearest,从标准的角度似乎应该是3。。。但IEEE好像也没说其他的round标准不对。。。

PS:很多语言干脆提供了两个函数,rem和mod 就是商向0或负无穷方向取整的选择,c从c99开始规定向0取整,py则规定向负无穷取整,选择而已,无所谓对错 就算是相同语言不同编译器也会不一样的。

在我发现这个问题之后,每当我更新IDE/编译器的时候都会用我的测试程序跑一遍,看看是不是和上个版本有什么不同。

有的时候一些小改动很坑的。

PS:有时候也不行,不能保证测试结果是唯一的。 问题的关键在于商是向负无穷取值还是向0取值 -7/10=0....-7
or
-7/10=-1....3
其他语言我不清楚,貌似c11规定向0取值 关于负数的余数,楼上很多网友已经阐述了纯数学概念上的意义。我想从另一个角度说说我的看法。先明确一点:我们讨论的是“被除数”(分子)是负整数,而除数(分母)是正整数的情况。

先看一个例子: (-17) mod 5 =?

答案一: (-17) = (-3)*5 + (-2),所以余数是 -2 。

答案二: (-17) = (-4)*5 + (+3),所以余数是 +3 。

首先,从“纯数学”概念上说,两个答案都“对”,就好像解方程的时候出现“复数解”一样,也是一个解。所以各种编译器按照各自的逻辑来产生余数。

但是,从人类思维角度上说,“负数”的起源是因为“不足、欠缺”,使用负数是为了知道有多欠缺,然后去补救。从这个角度才能正确理解“负数的余数”的实际意义(区别于纯数学概念)。

打个比方,你和另外5个同学住在宿舍里,你很勤快,那5个人很懒,让你帮忙买早餐,比如说,油条、豆浆 …… 你提着他们的早餐回来,对他们说:“一共17块钱。”就是说,他们5个人一共欠你17元。平均每人给你 17/5=3.4元。

于是他们就翻箱倒柜 —— 不是没有钱,而是在找零钱,每人都要拿0.4元,嗯,各位看官不妨找找自己身上有没有4毛钱 …… 结果就是,都找不到零钱,怎么办?于是有两种办法:

办法一:每人给你3块钱,但是总共还欠你2块钱,余数= -2

办法二:每人给你4块钱,但是你要给回他们3块钱,余数 = +3

现在问题是:各位作为人类,倾向于采用哪一个办法?

上面说了,人类之所以使用负数,是为了知道“不足”,然后进行补救。现在既然欠了钱要还,我想那5位同学都会给你4块钱,倒不是说他们是为了给你3块钱跑腿费,而是他们想“了(liao)了(le)这笔账”,他们不想5个人 每人都欠你0.4元的人情(何况你还真的跑腿了),既然都还钱了,为什么还要留一笔“遗留问题”呢?

所以,从人类思维习惯和实际需要来说(再说一遍:区别于纯数学概念),无论被除数(分子)是正数还是负数,余数都应该取正数,这样才符合人类的思维习惯和实际需要。

题外话:就好像除数(分母)通常是正数一样,如果用一个负数来做除数(分母),人们会觉得很别扭,很难理解。

其实,如果允许余数可以是负数的话,那么 23%5 同样有两个答案,可以看作 +3,也可以是 -2,但我相信没有人会用 -2,第一反应肯定是用 +3 。

现在回到题主的问题: (-7)%10=? 是 +3 还是 -7 ?

如果说人话,就是:现在欠你7块钱,由10个人来还,怎么办?

办法一:每人还你一块钱,结果多出3块钱,余数=+3

办法二:每人还给你 0元,余数 = -7 ,结果最后,一切照旧,依然欠你7块钱 ……
数学语言说:向负无穷取值还是向0取值 ……

==========分割线==========分割线==========分割线==========分割线==========

说到这里,可能有人说,数学不是凭情感、看习惯的,数学是严谨的。

我非常赞同这个观点,对于数学这种推崇严密和严谨的科学,同样的操作数、同样的运算符,必然得到同样的运算结果。那么,余数这种“可正可负”的“双重标准”是致命的 Fatal Error ,会摧毁数学大殿的根基。试想一下,-7伏和+3伏是两个截然相反的脉冲信号,足以让航天飞机掉进茫茫大海了……

还是以 (-7)%10 为例。同余定理是数学的基础定理之一,中学生都懂,我们来看看:

13 %10 = 3
(13+10)%10= 3
(13+20)%10= 3
(13-10)%10= 3
(13-20)%10=(-7)%10=? —— 问题来了。

显然,根据余数定理,答案无疑就是+3 ,而不是 -7 。这与我的上述观点互相印证。

如果认为 (-7)%10=-7 的话,那么连中学生都懂的余数定理就不成立了,数学变得如此脆弱,如此不堪一击。

余数定理是计算机表示负数、补数的理论基础,那些编译器产生的混乱结果,恰恰说明这些编译器的开发者不懂得余数的概念和意义。毕竟,搞电脑和搞数学是不同的领域。 因为数学上一般不关心负数的余数,数论一般讨论的都是正整数。 可能是程序员没有区分开 取余和取模,百度一下取余,取模。仅供参考 说的好像各个编程语言内部是统一的一样。。

请题主先把cl、gcc、clang、cmake、tc等实现的各主要版本都实验一遍。。
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1666
14
CakePHP 教程
1425
52
Laravel 教程
1324
25
PHP教程
1272
29
C# 教程
1251
24
说明PHP中的安全密码散列(例如,password_hash,password_verify)。为什么不使用MD5或SHA1? 说明PHP中的安全密码散列(例如,password_hash,password_verify)。为什么不使用MD5或SHA1? Apr 17, 2025 am 12:06 AM

在PHP中,应使用password_hash和password_verify函数实现安全的密码哈希处理,不应使用MD5或SHA1。1)password_hash生成包含盐值的哈希,增强安全性。2)password_verify验证密码,通过比较哈希值确保安全。3)MD5和SHA1易受攻击且缺乏盐值,不适合现代密码安全。

PHP和Python:比较两种流行的编程语言 PHP和Python:比较两种流行的编程语言 Apr 14, 2025 am 12:13 AM

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP行动:现实世界中的示例和应用程序 PHP行动:现实世界中的示例和应用程序 Apr 14, 2025 am 12:19 AM

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

PHP:网络开发的关键语言 PHP:网络开发的关键语言 Apr 13, 2025 am 12:08 AM

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

PHP的持久相关性:它还活着吗? PHP的持久相关性:它还活着吗? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在现代编程领域中依然占据重要地位。1)PHP的简单易学和强大社区支持使其在Web开发中广泛应用;2)其灵活性和稳定性使其在处理Web表单、数据库操作和文件处理等方面表现出色;3)PHP不断进化和优化,适用于初学者和经验丰富的开发者。

PHP类型提示如何起作用,包括标量类型,返回类型,联合类型和无效类型? PHP类型提示如何起作用,包括标量类型,返回类型,联合类型和无效类型? Apr 17, 2025 am 12:25 AM

PHP类型提示提升代码质量和可读性。1)标量类型提示:自PHP7.0起,允许在函数参数中指定基本数据类型,如int、float等。2)返回类型提示:确保函数返回值类型的一致性。3)联合类型提示:自PHP8.0起,允许在函数参数或返回值中指定多个类型。4)可空类型提示:允许包含null值,处理可能返回空值的函数。

PHP和Python:代码示例和比较 PHP和Python:代码示例和比较 Apr 15, 2025 am 12:07 AM

PHP和Python各有优劣,选择取决于项目需求和个人偏好。1.PHP适合快速开发和维护大型Web应用。2.Python在数据科学和机器学习领域占据主导地位。

PHP与其他语言:比较 PHP与其他语言:比较 Apr 13, 2025 am 12:19 AM

PHP适合web开发,特别是在快速开发和处理动态内容方面表现出色,但不擅长数据科学和企业级应用。与Python相比,PHP在web开发中更具优势,但在数据科学领域不如Python;与Java相比,PHP在企业级应用中表现较差,但在web开发中更灵活;与JavaScript相比,PHP在后端开发中更简洁,但在前端开发中不如JavaScript。

See all articles