Octave中循环变量i的两种sprintf输出为何解释不同?
为啥这两行代码的输出不一样?
嘿,咱们一步步拆解这个问题,你很快就能明白啦:
核心原因:两个传入的数值根本不一样
这两行代码最本质的区别,就是传给sprintf的第二个参数完全不同:
- 第一行是直接用了变量
i——也就是你从x(:,1)里取出来的原始数值(或者列向量,取决于循环的遍历方式) - 第二行是用了
i**i,也就是把i自己做幂运算(i的i次方)后的结果
一个是原始值,一个是原始值经过计算后的新值,数值本身就天差地别,格式化输出的结果当然不一样啦。举个具体的例子:如果i是0.33,那i**i大概是0.712,这俩数肯定不一样对吧?
顺便说下你代码里的%d格式符坑
你这里用了%d作为格式化符号,得提一嘴:%d是专门用来格式化整数的,但你的i是double类型的浮点数(从whos的输出能看到x是double类)。在Octave里,用%d处理浮点数时,会直接把小数部分截断成整数——比如0.330077会变成0,1.99会变成1。但你给出的第一行输出却是小数,这大概率是你笔误写错了格式符(比如实际用的是%f或%g,这俩才是给浮点数用的),或者是因为i是列向量,sprintf处理向量时的特殊表现?
给你个小测试代码,跑一下就能明白:
i = 0.330077; disp(sprintf('用%d格式化i:%d\n', i)); % 输出会是 用%d格式化i:0 disp(sprintf('用%f格式化i:%f\n', i)); % 输出才会是 用%f格式化i:0.330077 disp(sprintf('用%f格式化i**i:%f\n', i**i)); % 计算0.33^0.33≈0.712,输出对应小数
补充:Octave的for循环遍历逻辑
另外,你的循环是for i=x(:,1),这里也得注意:Octave的for循环默认是按列遍历矩阵的。x(:,1)是个10x1的列向量,所以这个循环只会执行一次,i会被赋值成整个10x1的列向量。如果你的输出是多行,说明你可能实际写的是for i=x(:,1)'(转成行向量,按单个元素遍历),或者for i=1:length(x(:,1))(遍历索引,再取x(i,1))。这也会影响sprintf的输出——如果i是列向量,sprintf会依次格式化每个元素,输出多行内容。
总结一下:
- 两行输出不同的核心就是一个用原始值,一个用了幂运算后的计算值,数值本身不同
- 别用错格式化符,浮点数记得用
%f或%g,%d是给整数用的哦
内容的提问来源于stack exchange,提问作者monkwoo
相关产品推荐
相关产品推荐

