相关疑难解决方法(0)

printf和co如何区分float和double

由于它没有强类型,我认为它只是选择了正确的内存大小并根据参数的类型对其进行解释.但是float和double都使用%f,它们的大小不同.

PS我可以看到如何通过将值复制到临时和转换(这是正确的吗?)可以起作用,但是它对scanfs/sscanf有什么作用?

c floating-point printf

44
推荐指数
1
解决办法
2万
查看次数

当printf中使用%d时,float变量会发生什么?

我想通过阅读来学习C C程序设计语言,第2版.我有一些编程经验,但没有C.

我目前在第1章.我有以下代码:


  float f;
  for (f = 0.0; f <= 3; f += 1.1)
      printf("A: %3f B: %6.2f\n", f, f + 0.15);
Run Code Online (Sandbox Code Playgroud)

它打印输出:

A: 0.000000 B:   0.15
A: 1.100000 B:   1.25
A: 2.200000 B:   2.35
Run Code Online (Sandbox Code Playgroud)

看起来很好.


现在我按如下方式更改printf:

printf("A: %3d B: %6.2f\n", f, f + 0.15);
Run Code Online (Sandbox Code Playgroud)

新的输出是

A:   0 B:   0.00
A: -1610612736 B:   0.00
A: -1610612736 B: -625777476808257557292155887552002761191109083510753486844893290688350183831589633800863219712.00
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?我希望浮点数转换为int,因为我使用了%d,但事实并非如此.另外,为什么价值B也出错?这里发生了什么事?

c floating-point printf

16
推荐指数
2
解决办法
1万
查看次数

.NET的Double.ToString方法中的Round-two错误

在数学上,考虑这个问题的有理数

8725724278030350 / 2**48
Run Code Online (Sandbox Code Playgroud)

其中**在分母表示取幂,即,分母是248次方.(分数不在最低方面,通过2可还原的)此数目是恰好作为表示的System.Double.它的十进制扩展是

31.0000000000000'49'73799150320701301097869873046875 (exact)
Run Code Online (Sandbox Code Playgroud)

撇号不代表缺失的数字,而只是标记圆形到15的分数.将执行17位数字.

请注意以下内容:如果此数字四舍五入为15位,则结果为31(后跟十三0秒),因为下一个数字(49...)以a开头4(意味着向下舍入).但如果数字首先四舍五入为17位,然后四舍五入为15位,结果可能是31.0000000000001.这是因为第一次舍入通过将49...数字增加到50 (terminates)(下一个数字73...)而向上舍入,然后第二次舍入可能再次向上舍入(当中点舍入规则表示"从零开始舍入"时).

(当然,还有更多具有上述特征的数字.)

现在,事实证明.NET的这个数字的标准字符串表示是"31.0000000000001".问题:这不是一个错误吗?通过标准字符串表示,我们指的String是由参数Double.ToString()实例方法产生的,当然,该方法与生成的方法相同ToString("G").

需要注意的一个有趣的事情是,如果你投的上述号码System.Decimal,然后你得到一个decimal31准确!请参阅此Stack Overflow问题,以讨论将a转换DoubleDecimal包含第一个舍入到15位的令人惊讶的事实.这意味着转换为Decimal正确的舍入到15位数,而调用ToSting()是不正确的.

总而言之,我们有一个浮点数,当输出给用户时,是31.0000000000001,但当转换为Decimal …

.net c# floating-point rounding

15
推荐指数
2
解决办法
1965
查看次数

标签 统计

floating-point ×3

c ×2

printf ×2

.net ×1

c# ×1

rounding ×1