c/c++语言开发共享sprintf无效格式’%d’

这有效:

> sprintf('%d', c(1, 1.5)) [1] "1" "1" 

这不是:

 > sprintf('%d', c(1.5, 1)) Error in sprintf("%d", c(1.5, 1)) : invalid format '%d'; use format %f, %e, %g or %a for numeric objects 

为什么?

    这实际上是非常有趣的问题。 首先, %d代表整数。 如果可能,vector参数将被回收,但如果它是c(1.5, 1) ,当sprintf()尝试用1.5替换%d (不是整数)时,它将失败。

    我认为这可能与以下事实有关:在R中,integer和double都是数字模式,例如:

     storage.mode(c(1.5, 1)) # [1] "double" storage.mode(c(1, 1.5)) # [1] "double" mode(c(1,1.5)) # [1] "numeric" mode(c(1.5,1)) # [1] "numeric" 

    因此,两个向量应存储为double。 有关R语言定义和文档中的向量的更多信息? numeric ? numeric

    潜在的混淆是R使用“数字”模式来表示“双重或整数”

    我可能已经在底层的C代码中找到了解释发生了什么的行:

     if(TYPEOF(_this) == REALSXP) { double r = REAL(_this)[0]; if((double)((int) r) == r) _this = coerceVector(_this, INTSXP); 

    此代码执行以下操作:如果向量类型为REALSXP (表示数字),则将向量的第一个成员转换为double r 。 然后将r为整数然后加倍,如果字节仍然相同, INTSXP整个向量转换为INTSXP 。 重要的是,此代码仅检查向量的第一个元素; 如果该元素可以强制转换为整数,则强制转换整个向量,否则代码会产生错误。

    为了测试这个假设,可以使用自定义sprintf()编译R,其中double r = REAL(_this)[0]; 改为double r = REAL(_this)[1]; 并测试c(1.5, 1)是否现在有效。

    需要了解更多c/c++开发分享sprintf无效格式’%d’,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享sprintf无效格式’%d’相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979735.html

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐