hzhh95963

蓝猫淘气三千问:为什么舰C里面不使用四舍五入?

[i=s] 本帖最后由 hzhh95963 于 2015-3-10 00:05 编辑

看到不少提督在计算火力和伤害等数值的时候,在无意中使用了四舍五入的取整方式。但是事实上,舰C的取整全部是向下取整(或向零取整,后面会提)这是为何呢?

那么我们来看一看计算机是如何处理取整这个操作的。常见的C语言来实现取整:

[code]// C sytle

float foo = 10.6;

int bar = (int)foo; // bar == 10[/code]或

[code]// C sytle

float foo = 10.6;

int bar = int(foo); // bar == 10[/code]

或者是在C++更加推荐的方式:

[code]// C++ sytle

float foo = 10.6;

int bar = static_cast(foo); // bar == 10[/code]

这里面要仔细追究也是说来话长。为什么C/C++没有采用向最接近整数取整而是向零取整?

这个问题其实很尴尬……在C99以前,C语言的标准都没有明确规定到底应该怎么取整,这个问题被留给了编译器自己来决定。编译器选择的是向Fortran靠拢。(后来在C99,向零取整就变成了语言标准)。那么Fortran为什么又要那么取整呢?具体的原因我没有调查到。这其中应该有数学上的考量,也有对当时的硬件环境的考虑。毕竟Fortran诞生的时候,就连IEEE 754这个浮点数标准都还没有出现呢。然后C++为了兼容C语言,继承了这个设计……接下来Java这个C++的精神继任者也继续采用了这个设计……

不过舰娘的后台服务端一般不会是用C/C++来写的。那些动态语言们往往有其他的实现方式。

比如,我来看看用世界上最好的编程语言PHP怎么来实现这个[s](才不是)[/s]

[code] $foo = 10.6;

$bar = floor($foo); // $bar == 10

$bar = round($foo); // $bar == 11

$bar = intval($foo) // $bar == 10

?>[/code]floor和intval有什么区别?floor返回的是一个浮点型,intval返回的是一个整型,round和ceil返回的居然也是浮点型……

[s]我个人认为PHP的类型转换简直是个死亡雷区……[/s]

那么不要管PHP了,日本人发明的Ruby是什么情况呢?

[code]# Ruby

foo = 10.6

bar = foo.floor # bar == 10

bar = foo.round # bar == 11[/code]

嗯……这两个都很正常地返回了一个整型……

说了半天,舰C是什么情况?舰C似乎并没有像前面的动态语言那样有过四舍五入?我个人认为,舰C作为一个使用HTTP连接的页游,后台非常有可能是用Java写的:

[code]// Java

foo = 10.6;

int bar = (int)foo; // bar == 10[/code](好像有点眼熟)

看,是不是都挺简单的?那么如果要使用四舍五入规则呢?事实上,一直到C99和C++11之前,C/C++都没有一个round函数。好吧,我就只写一个C++版本的吧。

[code]// C++ sytle

float foo = 10.6;

int bar;

int floor = static_cast(foo);

if ((foo – floor) < 0.5 || (foo - floor) > -0.5) {

bar = floor;

} else {

bar = floor + ((foo > 0) – (foo < 0)); // bar == 11
}[/code]感觉效率不是很高的样子……

不过Java就更加残念了……它标准库里自带的Math.round的实现是错误的……把-10.5传给这个函数返回的结果是-10而不是-11……

另外还有一些更复杂的数值修约规则,比如“奇进偶舍”……要写的代码肯定就是更长了……除非采取某些特别tricky的办法,具体不再展开了……

那么,现在假设你是程序员来实现舰娘的服务器,你会选择哪种方式呢?

一些题外话

事实上,常用的编程语言有两种取整,一种是“向零取整”,向0方向取最接近的整数。C、C++、Java采用的就是这种模式。另一种是“向下取整”,向-∞方向取最接近的整数,Python、Ruby就是采用的这种模式。两者在正数上是一致的,区别就在于对负数取整的不同行为。这里就不再展开了。编程语言具体采用哪种方式都有诸多的原因。不过无论用哪种方式,都有大坑在等着……

发表回复

  1. 围观程序猿{:4_91:}

  2. 水雲逸说道:

    {:4_102:}{:4_103:}然而這並沒有什麼卵用,最後都是看臉暴擊的

  3. hzhh95963说道:

    水雲逸 发表于 2015-3-10 12:38

    然而這並沒有什麼卵用,最後都是看臉暴擊的

    {:4_102:}怎么没用了,看我科学灌水涨经验

  4. wakawakashine说道:

    楼主帖子怎么发成吐槽吹水了{:4_114:}

  5. hzhh95963说道:

    wakawakashine 发表于 2015-3-10 15:44

    楼主帖子怎么发成吐槽吹水了

    {:4_102:}本来就是来灌水的呀。这东西其实和游戏没什么太大关系

  6. 枫雪三叶草说道:

    其实我就看看 觉得dalao好屌

  7. oss说道:

    围观大神技术帖……其实完全看不懂poi{:4_100:}

官方微信

Login

跳至工具栏