我曾一直以为,MATLAB 的 double 数据类型就是 C/C++ 中的 double 类型,即双精度浮点数,正如 MATLAB 和 C/C++ 中的 int 都是整数一样。直到不久前,我才发现并不是如此。

问题的发现

几天前,我遇到一个问题,需要把一个字符串转换成整数。那时我已经知道了,把整数转换成字符串的函数是 int2str(),于是猜想,把字符串反过来转换成整数的函数应该是 str2int(),但是在 MATLAB 的幫助中搜索它,居然找不到。我索性在搜索框中输入 str2 几个字符,看看会弹出什么提示,于是就找到了 str2num() 函数。一想,也对,MATLAB 必竟是高级语言,应该会自动判断字符串是整数还是浮点数,所以就只需要一个函数了。

但是,在使用 str2num() 函数转换字符串时,MATLAB 又提示我,「如果您要对标量值进行操作,请考虑使用 STR2DOUBLE 以提高性能」。这时我就疑惑了,我要转换出整数,可是 str2double() 听名字,应该只能转换出浮点数,这怎么能替换呢?

再深入看一下 MATLAB 关于数据类型的文档,就可以得出答案。

double 究竟是什么

MATLAB 的文档中对于 double 的介绍是:

double is the default numeric data type (class) in MATLAB®, providing sufficient precision for most computational tasks. Numeric variables are automatically stored as 64-bit (8-byte) double-precision floating-point values.

从这两句话中我们可以获得这几个信息:

  • double 是 MATLAB 的默认数据类型。也就是说,不指明数据类型的赋值语句,例如 a=3b=[1 2 3],都是自动赋值为 double 类型的。
  • double 可以给大多数计算任务提供足够的精度。
  • double 类型是 64 比特,即 8 字节的双精度浮点数。

这么看起来,double 不就根 C/C++ 中的双精度浮点数一样吗?但是,它与 C/C++ 中的浮点数的确有区别。

MATLAB 中的 double 的特殊性

根据我的测试,MATLAB 中的 double 类型和 C/C++ 中的 double 类型的不同,主要体现在用来存放整数时的表现上。

当 MATLAB 的 double 变量中存放一个整数值时,它会表现得和整数一模一样:它仍然可以像整数一样进行计算,并且结果也会像整数一样打印出来,不会有小数点;而 C/C++ 中的 double 变量,不管存放了什么,打印出来都会是有小数点的。MATLAB 中的 double,只要其中存储的是正整数,甚至可以当成数组下标来使用。

这也是可以理解的,毕竟,MATLAB 是弱类型的,把数据类型弄得少一点、统一一点,可以方便使用,让用户可以把主要精力放在计算本身上。