百科问答小站 logo
百科问答小站 font logo



计算机能不能真正意义上存储一个无理数? 第1页

  

user avatar   ghostwolf 网友的相关建议: 
      

不能,更没必要,计算机只能存储确定的东西,现在计算机基本都是冯诺依曼体系,简单的组成原理就是下面这样。

存储器通过输入设备或运算器知道要存储的数据,你存储一个1是知道这个数就是1,你存储一张图片也是因为确定这张图片是由哪些信息组成的。

而无理数是无限不循环小数,小数点之后的数字有无限多个,并且不会循环,谁都无法确定后面会有什么,换句话说你要不停的输入或者计算,永无止境,需要的存储空间也是无限大的。

常见的无理数比如圆周率π,平时怎么用的呢?以C++为例,我们可以引用头文件<math.h>,里面定义好了M_PI,如下所示:

#if defined(_USE_MATH_DEFINES) && !defined(_MATH_DEFINES_DEFINED)
#define _MATH_DEFINES_DEFINED

#define M_E 2.71828182845904523536
#define M_LOG2E 1.44269504088896340736
#define M_LOG10E 0.434294481903251827651
#define M_LN2 0.693147180559945309417
#define M_LN10 2.30258509299404568402
#define M_PI 3.14159265358979323846
#define M_PI_2 1.57079632679489661923
#define M_PI_4 0.785398163397448309616
#define M_1_PI 0.318309886183790671538
#define M_2_PI 0.636619772367581343076
#define M_2_SQRTPI 1.12837916709551257390
#define M_SQRT2 1.41421356237309504880
#define M_SQRT1_2 0.707106781186547524401

#endif /* _USE_MATH_DEFINES */

当然也可以自己定义

Const double PI=3.1415

如果你认为精度不够,还可以写一个方法计算


最关键的是在计算机中存储无理数是没意义的,基本也不会需要那么高的精度,还使得计算变的非常麻烦,也许量子计算可以解决。今天刚学到的词“遇事不决,量子力学”


user avatar   kuangthree 网友的相关建议: 
      

只要你能定义这个数,并给出计算方式,那就可以存储。

比如有理数可以表示为两个整数的商,只要分别存储这两个整数,那么这个有理数就被保存了下来。

这种数,是通过2开平方得到的,只要我们在内存中对根号和2进行编码,在程序中定义例如 之类的运算规则,让程序支持一定程度的无理数之间的计算,那就相当于保存了。

π、e这种无理数,可以通过无穷级数的方式计算,只要有计算的过程,并在内存中用一个标号表示,在解析、求十进制近似值时用上计算过程,那就相当于存储了这个无理数了。或者说可以直接存储无穷级数的代数式。

但是,无法给出定义或没有可无限精确的计算方法的无理数,计算机是无法存储的。

比如参考是否存在一个「无法判定为有理数或无理数」的实数?


讨论问题之前,明确定义可以避免99%的争论。

对于这个问题的争论就在于对“存储”的定义上。

众所周知,计算机可以存储整数。但是实际上呢?所谓的“整数”,不过是计算机内存里一排二极管的电平状态罢了,凭什么我们认为这就算计算机存储了整数?

就像你在白纸上写下一个“2”,从某种意义上来讲,不过是将一个由植物纤维制造的材料的部分区域用墨水染黑,凭什么认为这是一个“2”呢?

因为这样解释是有意义的。我们能理解白纸上“2”的含义,我们能够从白纸上这个被染黑区域的形状得到“2”这个信息。所以,脱离了我们学习过数学的人类,白纸上的“2”是没有意义的,是我们给白纸上这个“2”以意义。如果有人随意在白纸上涂了一个符号,而我们无法理解这个符号的意义,那可能只会把这当成白纸上的污渍,或者花纹之类的无意义的东西。

回到计算机层面,内存里一排二极管保持某种高低电平状态,为什么能称为“存储”了一个整数?

因为CPU可以读取这一串状态,并对其进行计算。CPU是按照什么对这些状态进行计算的?指令序列,也就是程序。

从互联网上随便找一张图片下载到本地,把扩展名改成 .txt 打开,你会看到一堆无意义的乱码,把扩展名改成 .mp3 打开,会告诉你音频文件解析失败。只有改回原来的扩展名打开,你才能看到这张图片。为什么?因为当扩展名是txt的时候,操作系统会选择文本处理程序来读取这个文件,而扩展名是mp3的时候,操作系统会选择音乐播放器来打开这个文件,当然,这是无意义的。因为这个文件只对图片浏览器有意义,对于音乐播放器,它不过是一段格式错误,无法解析,没有定义的二进制序列罢了。所以我们认为计算机存储了一张图片,这种“存储”的意义,本身就包含了将二进制数据解析成RGB,投射到屏幕上让我们理解的过程。

同样,“存储”一个无理数,不是说仅仅保存一个符号就好,也不是说必须要保存所有的数位,关键就是能够理解内存上这段二进制序列的“过程”,将其用于计算。



还不能理解的同学们可以参照下这个回答:


反对楼下的实名反对:

理由如下:


1、所谓【所谓的定义本质上是一种描述模型】:
对整数的定义也是一种描述模型。
人类在平时采用十进制的计数方法,先定义出 0 - 9 这十个基本数字符号,然后在此基础上,用数位等方式定义了更大的数字。
计算机中用二进制来存储整数也是如此。用“高电平”与“低电平”表示一个数位,用一排二极管的高低电平状态来表示一个数。
本质上都是用“符号”去描述“数”的过程,无论是√2,还是π、1、3、9.9、65%、1/3。如果因为这样就认为计算机没有“存储”无理数,那计算机也同样没有存储过整数。
我们平常所说的,计算机存储一个数本身就是存储了这个整数的【定义】、【二进制表示方式】、【描述模型】,包括整数。否则,让计算机存储一个数字 5,难道真的要在机箱里塞五个鸡蛋才算存储了 5 吗?


2、所谓【无理数的定义也是一样,比如圆周率,我们知道是周长和直径的比值。也知道是约等于3.14,但是谁能确切的告诉我是等于多少吗?】:
我能确切的告诉你,圆周率就是π,就是圆周长和直径的比值。
“不能用十进制小数的方式精确表示”不等同于“不能确切的告诉你是多少”。
认为一定要被十进制小数方式精确表示才是确切的值,这是对无理数的不理解与歧视。
打个比方来说,有理数就像数中的有户口的存在,有国家颁发的身份证ID,比如“2”。可定义的无理数就像黑户,虽然没有身份证ID,但还是有名字,有社会关系的,比如“√2”,它由 2 开平方得到,就像是 2 的“亲戚”。靠着身份证ID能找到你这个人,靠着你的姓名、籍贯、位置、家庭、人际关系等信息也能找到你这个人,你不能说靠后者找到的就不是准确的人了。


3、对于【另外无理数是不能用分数表示的】
对的,无理数当然不能用分数表示,但是我从来没说过能用分数表示,原回答第二段说的是有理数。仔细看。


4、【再按高票的回答说,只要储存无理数的定义,需要无理数,直接计算就行】
不是需要无理数,直接计算就行。
是需要无理数在某个精确度下的十进制小数表示,直接计算就行。
再说部分无理数之间是有√2 × √3 = √6 之类的计算规则的,计算机也可以进行。并非一定要得到十进制精确小数结果才算是计算,回答里贴的关于卡西欧计算器的回答已经说明了这一点。


——————————补充回答————————————

针对该 @慕静安 该反对意见的反对意见:

挑选重点反驳:

一、『最高赞回答的不严谨之处在于,认为计算机定义的以sqrt函数为例的计算方式与无理数√a的开根号计算方式等价,但是却无法证明这二者等价。』

稻草人谬误。

我从未认为sqrt为例的函数计算方式与开根等价。

一般编程语言中,sqrt函数是被人为定义为近似计算的,返回值是一个浮点数类型。之所以是近似运算,主要是因为:

1、计算机中的浮点数编码方式无法精确地表达无理数。

2、实用主义。浮点数可以满足现实生活中计算的大多数需求。

所以,局限sqrt等函数的不是因为计算机本身的能力,而是浮点数的表达。

这并不代表计算机就无法准确的进行结果为无理数的开方运算了。

许多答主和评论提到了mathematia、matlab,还有带有CAS系统的卡西欧高级计算器。这些计算器都可以将运算的结果表示为根式的形式。

没有任何数学专业的人会认为把无理数表示为根式的形式是错误的,不准确的。具体论述接下来会说。

二、『在这里,问题就来了,如何计算y=√x,我们都知道√是平方运算的逆运算,但是几千年来无数的数学家从来没有人能够用最基础的加减乘除运算来表示开平方运算√的计算过程。这也就是说,人类发明了√这个符号以及开平方运算,却并不知道开平方运算应该怎么计算。』

『正是因为几千年来人类都无法得到开平方运算√的计算过程,所以人类才会将形如√a的解认为是某些方程的解析解。意思大概就是,行了就这样吧,反正人类也解不出来√a到底是多少,表示成一个符号√a就勉强算作人类已经在现有条件下给出该方程的解,剩下的问题就留给后人去解决吧。』

这是全文错误最严重的两段。

首先来说说『几千年来无数的数学家从来没有人能够用最基础的加减乘除运算来表示开平方运算√的计算过程』。

这句话隐含了一个要求,一种相对『高级』的计算,必须要用比其更『基础』的运算来实现。

我们先不谈这个要求是否合理,让我们看看加减乘除是否满足这个要求。

回忆一下各位幼儿园刚学算数的时期,或者想象一下鸿蒙初开之时,人类最早能接触到的算数方法是什么 —— 加法。

加法是直观且显而易见的:一个野果,加上一个野果,结果是两个野果。人类很快理解了这个过程,并且把与其相反的过程称为减法。

在加法的基础上,人类又发明了将多个相同的数累加的乘法。从某种意义上来讲,它确实是用比它更加『基础』的加法实现的。

然而到了发明除法的时候,人类发现问题了。

那就是,存在某两个数无法整除。

在人类只掌握了正整数的情况下,把『除法』定义为『乘法』的逆运算,是存在问题的。

比如:43除以7,你无法找到任何一个数与7相乘能够得到43。

于是,人类懵逼了,他们不知道这样的除法该『怎样运算』,干脆留个余数吧。但是总是感觉有点怪怪的。

这时有一个智者站了出来:“不如我们用分数吧?”

如果按照实名反对本回答的慕先生的逻辑,这位来自不清楚是古巴比伦还是中国的发明分数的智者的意思大概就是『行了就这样吧,反正人类也解不出来 43 除以 7 到底是多少,表示成一个符号43/7,就勉强算作人类已经在现有条件下给出该问题的解,剩下的问题就留给后人去解决吧』。

实际上呢?我们都知道,这是人类数学历史上一个遥远而古老的创举。它第一次为人类扩展了『数』的范围,发明了『分数』。

到如今,没有任何数学家会觉得,自己的老祖宗发明 43/7 这种数是为了偷懒,给我们甩锅。

时间飞逝,到了公元前500年,人们对于数有了更加深刻的认识。当时古希腊的学者认为,任何数都能用两个整数的比表示,其中的代表就是古希腊思想界的伟人毕达哥拉斯。

有一天,毕达哥拉斯的学生希伯索斯找到他,说自己有一个意外发现:边长为1的正方形对角线长度无法被表示为两个整数的比值。

接过他的证明,毕达哥拉斯的脸色由嘲笑,转为凝重,进而转为迷茫,最终拍案而起,把这个可怜的异端学生扔进大海里喂了鲨鱼。

计算边长为1的正方形对角线的长度并不难,简单的切割,变换一下,就可以得到这个数的平方为2。

什么?你说你没问这个数平方是多少,问的是这个数是多少?

那么很遗憾,似乎在有理数的范围内,还没有哪个数的平方是2的。那时候人们才发现,有理数的描述是有局限的,想要描述这个数,除非突破有理数。

于是,√2 揭竿而起:“我不做有理数了!”

是的,在某些人眼里『解不出值才勉强用个符号表示』的无奈之举,实际上是数学史上最伟大的突破之一。明明是为后人解决了不少麻烦,何谈『把麻烦交给后人解决』?

让人用『加减乘除』等运算,在有理数范围内实现精确的开方,就像让人用『加减乘』等运算,在整数范围内实现精确的除法一样,简直是井蛙语海,夏虫语冰。

三、『在这个问题的最高赞回答的评论中,作者屡次忽略√a如何计算的问题,也在忽略计算机能不能采用二进制的算法来表示与“该无理数的计算过程”完全等价的计算过程。要么是作者在想当然的认为计算机表示的计算过程就是无理数的计算过程,要么就是作者根本没有意识到二进制计算过程的局限性。』

真的不是我忽略√a如何计算的问题,这句话最大的问题,是根本没把√2之类的根式当成和1、3.5、1/2 一样的数。在此君看来,大概任何数必须在计算机上以标准二进制小数方式存储才能算是最终结果,这已经不如上面说的古希腊前辈毕达哥拉斯了。因为毕达哥拉斯至少是承认分数的。

对于所谓『作者在想当然的认为计算机表示的计算过程就是无理数的计算过程』,貌似没有任何数学专业的人会觉得,一个已经表达成最简二次根式的无理数居然还需要把它化为小数方式才能算计算。

对于所谓『在忽略计算机能不能采用二进制的算法来表示与“该无理数的计算过程”完全等价的计算过程』,我从来没听说过什么算法是二进制的,难道用一千进制的算法就不是那个算法了?

还有『作者根本没有意识到二进制计算过程的局限性』,所谓的『二进制计算过程的局限性』,在此君的语境中,实际上指的是『小数表达方式的局限性』,那不用小数表示不就得了?还需要想?


四、『我们再来看看最高赞回答的作者以为的计算机计算无理数的过程是怎么计算的。首先,计算机定义了“数a”和“函数sqrt”,用函数y=sqrt(x)来表示开平方运算√,通过输入x=a,将函数的返回值y=sqrt(a)当作无理数√a。』

我仔细看了下,我完全没表露过这个意思,不知道我的表达方式是不是有问题,让此君如此理解。我根本没说过让sqrt(a)的返回值当做无理数√a这种话。

我的意思是定义一个叫sqrt的数学符号,这个符号可以叫sqrt,可以叫√,可以叫『根号』,甚至可以叫小明。并且给计算机以关于sqrt符号的运算规则,例如:

sqrt(a) * sqrt(b) = sqrt(ab)

sqrt(sqrt(a)) = 开四次方(a)

至于『开四次方(a)』能不能表示一个无理数,我前面已经说过了,不再赘述。熟悉编程的朋友能立刻明白我的意思。

前面贴过的关于卡西欧CAS计算器的链接感兴趣的朋友可以去看看。


最终总结:

题主这个看似有问题的问题,其实本身包含了对于数学、计算机以及基本逻辑的理解,还有一些哲学元素。我可以用尽量所有学科都能看懂的话来比喻一下我的结论:

计算机只能存储用0和1编码的事物,就像中国普通人只能理解汉语。对于整数、浮点数的编码,计算机界有着约定俗成的规矩,就像中国人对于中国司空见惯的事物总有一个汉语命名。

而在计算机中处理无理数,就像是在中国谈论、记录中国从未出现过的概念,那么这个概念一定不能用汉语来描述、记载吗?

不是这样的。我们有多种方式:

1、直接为其取一个新的名字,或者直接音译来表述。比如『巧克力』。

2、用中国已经存在的字词结合起来描述。比如『科学』。

难道这些词的表述不够精准吗?不,当中国人逐渐接受,并能够使用这些词汇来交流的时候,这些词就是精准的只指代了它所指代的概念。

方式1,就好比用 π 的unicode码来直接表示圆周率这个超越数。方式2,就好比用把被开方数和根指数分别用整数编码形式保存的方式来保存根式形式的无理数。只要我们定义的规则能够对这些数进行准确的计算,那又凭什么不能说,我们存储了这些数呢?

注:这里的『计算』可不是指将其在有限时间内转化为任意给定精度的近似十进制小数(虽然这是题主的要求,而且完全可以做到),而指的是符合部分形式无理数规则的计算,如根式化简等。

————最后分割线————

这可能是我在知乎上打最多字的一个回答了,我只是想尽力表达自己对问题的见解,而并非一定要反驳所有反对意见。这些关于该问题的争论也让我自己本身对于某些事情有了新的思考与认识,我是很乐意的。我不敢说这个回答完全正确,准确的来说,对于带一点哲学思想的问题,看法不一致也是正常的。不过关于这个问题,我能说的想法基本上已经说完了,所以不会再修改这个答案,除非发现任何『知识性错误』。

感谢大家的评论,祝大家新年快乐。


user avatar   haozhi-yang-41 网友的相关建议: 
      

计算机能精确存储的数字应该只局限于代数数。

对于超越数,除了少数有特别命名的如e、pi等之外,应该都是不行的。




  

相关话题

  为什么不能说 20℃ 是 10℃ 的两倍? 
  3Blue1Brown 的视频是怎么制作的? 
  二维傅里叶变换是怎么进行的? 
  如何计算下面的级数? 
  穷人家的女孩应该转去计算机专业吗? 
  这个积分怎么处理? 
  (回答前请阅读描述)吐槽小学数学一边进水一边排水问题的现象到底说明了什么(已更新)? 
  计算机系学生应该怎样正确管理自己的电脑? 
  线性代数对于计算机专业的作用是什么呢? 
  如何评价 2021 年各卷高考数学题?有哪些「出其不意」的题和解法? 

前一个讨论
如何看待小米10 5G手机详细规格曝光,疑似采用 90Hz 屏幕、前后六摄、顶配约 4600 元?
下一个讨论
MIUI真的那么好用吗?





© 2024-12-03 - tinynew.org. All Rights Reserved.
© 2024-12-03 - tinynew.org. 保留所有权利