小编msk*_*her的帖子

PHP - 序列化浮点

我在6到8之间生成10个随机浮点数(完全有理由),并以序列化形式将它们写入mysql数据库.但是在存储时似乎出现了一个怪癖:

在存储之前我只是输出相同的数据来查看它的样子,这就是我得到的结果

a:10:{i:0;d:6.20000000000000017763568394002504646778106689453125;i:1;d:7.5999999999999996447286321199499070644378662109375;i:2;d:6.4000000000000003552713678800500929355621337890625;..}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我得到的数字很长,比如6.20000000000000017763568394002504646778106689453125而不是我真正想看到的,只有6.2.只有在我序列化数据时才会发生这种情况,如果我只是输出数组,我确实将浮点值设置为一位小数.这是我的代码:

function random_float ($min,$max) {
   return ($min+lcg_value()*(abs($max-$min)));
}

$a1 = random_float(6, 8);
$a1 = round($a1, 1);
$a2 = random_float(6, 8);
$a2 = round($a2, 1);    
$a3 = random_float(6, 8);
$a3 = round($a3, 1);
    ...
$array = array($a1, $a2, $a3, $a4, $a5, $a6, $a7, $a8, $a9, $a10);

echo serialize($array);
Run Code Online (Sandbox Code Playgroud)

php random floating-point serialization

11
推荐指数
3
解决办法
6449
查看次数

在Java中防止String.format("%.2f",doubleValue)中的舍入

如何防止String.format("%.2f", doubleValue);四舍五入(圆半算法)而不是截断它?

例如

doubleValue = 123.459
Run Code Online (Sandbox Code Playgroud)

格式化后,

doubleValue = 123.46
Run Code Online (Sandbox Code Playgroud)

我只想丢弃最后一位数,

123.45
Run Code Online (Sandbox Code Playgroud)

我知道还有其他方法可以做到这一点,我只想知道是否可以使用String.format.

java string format floating-point

11
推荐指数
2
解决办法
5万
查看次数

确定性浮点和.NET

我如何保证.NET应用程序中的浮点计算(比如在C#中)始终产生相同的位精确结果?特别是在使用不同版本的.NET并在不同平台上运行时(x86 vs x86_64).浮点运算的不准确无关紧要.

在Java中我会使用strictfp.在C/C++和其他低级语言中,这个问题基本上是通过访问FPU/SSE控制寄存器来解决的,但这在.NET中可能是不可能的.

即使控制了FPU控制寄存器,.NET的JIT也会在不同平台上生成不同的代码.在这种情况下,像HotSpot这样的东西会更糟糕......

我为什么需要它?我正在考虑编写一个实时策略(RTS)游戏,它在很大程度上依赖于快速浮点数学和锁定步进模拟.基本上我只会通过网络传输用户输入.这也适用于通过存储用户输入来实现重放的其他游戏.

不是一个选择:

  • 小数(太慢)
  • 固定点值(使用sqrt,sin,cos,tan,atan时太慢和麻烦......)
  • 像FPS一样在网络上更新状态:不能选择发送数百或几千个单位的位置信息

有任何想法吗?

floating-point deterministic multiplayer real-time-strategy

11
推荐指数
1
解决办法
564
查看次数

将大量小浮点数添加到一起的好方法是什么?

假设您在一个数组中有100000000个32位浮点值,并且每个浮点数的值都在0.0到1.0之间.如果你试图将它们全部加起来像这样

result = 0.0;
for (i = 0; i < 100000000; i++) {
    result += array[i];
}
Run Code Online (Sandbox Code Playgroud)

你遇到的问题result远远大于1.0.

那么有哪些方法可以更准确地执行求和?

algorithm floating-point numerical

11
推荐指数
1
解决办法
2443
查看次数

Tortoise SVN:比较两个目录(而不是文件或修订)

您可以使用Tortoise SVN比较两个修订或文件.还有比较两个目录的方法吗?

我有两个包含源代码的目录.90%的代码是相同的.现在我要在插件中存储相同的代码,因为重复的代码很糟糕.如果有比较两个目录的方法,Tortoise Diff将是完美的.

我怎样才能做到这一点?如果使用Tortoise是不可能的,那么为此目的,您是否还有其他想法/工具?

svn diff tortoisesvn compare code-duplication

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

停止包含div?

我目前在容器div中设置了div,如下所示:

<div id="container">  
    <div id="element"> Element 1 content </div>  
    <div id="element"> Element 2 content </div>  
    <div id="element"> Element 3 content </div>  
    <div id="element"> Element 4 content </div>  
</div>
Run Code Online (Sandbox Code Playgroud)

style.css中:

.container {
width:200px;
overflow-x:auto;
overflow-y:hidden;
}  

.element {
width:100px;
float:left;
}
Run Code Online (Sandbox Code Playgroud)

这是代码的jsFiddle:http://jsfiddle.net/vZWTc/.

所以,我希望每个元素彼此相邻排列(一行中所有4个),但只有前两个元素可见(容器是200px,每个元素是100px,所以一次只能看到2个) ,用户可以(水平)滚动到第3和第4个元素(因为它们不太重要)

但是,通过此设置,元素3和4将换行到下一行

更新容器类white-space:nowrap没有任何作用.这只会影响文本,而不会影响div.

有任何想法吗?提前致谢!

html css scroll overflow css-float

11
推荐指数
1
解决办法
4万
查看次数

在java中截断浮点数和双精度数

我想在java中截断一个float和一个double值.

以下是我的要求:1.如果我有12.49688f,它应该打印为12.49而不会四舍五入2.如果它是12.456的双倍,它应该打印为12.45而不会四舍五入3.无论如何,如果值是这样的话12.0,应仅打印为12.

条件3应始终牢记在心.它应与截断逻辑并发.

java floating-point double truncate

11
推荐指数
2
解决办法
5万
查看次数

为什么这是真的?

这是IEEE 754标准问题.我不完全理解它背后的机制.

public class Gray {  
    public static void main(String[] args){
        System.out.println( (float) (2000000000) == (float) (2000000000 + 50));
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ java floating-point

10
推荐指数
1
解决办法
703
查看次数

为什么DateTime到Unix时间使用double而不是整数?

我需要将DateTime转换为Unix时间戳.所以我用谷歌搜索它寻找一些示例代码

在我看到的几乎所有结果中,它们都double用作这种函数的返回值,即使在显式使用floor它将其转换为整数时也是如此.Unix时间戳总是整数.那么使用long或者int代替双重问题是什么?

static double ConvertToUnixTimestamp(DateTime date)
{
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    TimeSpan diff = date - origin;
    return Math.Floor(diff.TotalSeconds);
}
Run Code Online (Sandbox Code Playgroud)

.net c# floating-point datetime unix-timestamp

10
推荐指数
1
解决办法
6590
查看次数

在C中翻转双/浮点符号的最快方法

在C中翻转双(或浮点)符号的最快方法是什么?

我想,直接访问符号位将是最快的方法,并找到以下内容:

double a = 5.0;
*(__int64*)&a |= 0x8000000000000000;
// a = -5.0

float b = 3.0;
*(int*)&b |= 0x80000000;
// b = -3.0
Run Code Online (Sandbox Code Playgroud)

但是,上述内容不适用于负数:

double a = -5.0;
*(__int64*)&a |= 0x8000000000000000;
// a = -5.0
Run Code Online (Sandbox Code Playgroud)

c floating-point double bit-manipulation sign

10
推荐指数
3
解决办法
1万
查看次数