我想使用iostream和Visual C++从/向文本文件中读取和写入NaN值.当写NaN值时,我得到1.#QNAN.但是,读回来输出1.0.
float nan = std::numeric_limits<float>::quiet_NaN ();
std::ofstream os("output.txt");
os << nan ;
os.close();
Run Code Online (Sandbox Code Playgroud)
输出是1.#QNAN.
std::ifstream is("output.txt");
is >> nan ;
is.close();
Run Code Online (Sandbox Code Playgroud)
nan等于1.0.
解
最后,正如awoodland所建议的那样,我想出了这个解决方案.我选择"nan"作为NaN的字符串表示.<<和>>运算符都被覆盖.
using namespace ::std;
class NaNStream
{
public:
NaNStream(ostream& _out, istream& _in):out(_out), in(_in){}
template<typename T>
const NaNStream& operator<<(const T& v) const {out << v;return *this;}
template<typename T>
const NaNStream& operator>>(T& v) const {in >> v;return *this;}
protected:
ostream& out;
istream& in;
};
// override << operator for …Run Code Online (Sandbox Code Playgroud) 我有一个Joomla系统,我正在尝试更改搜索,以便它正确地在数据库中找到浮点值.
所以,我有一个在运行时构建的查询,如下所示:
select 'column1'
from 'some_table'
where 'some_float_field' <=> '2.18'
Run Code Online (Sandbox Code Playgroud)
这不起作用,它永远不会匹配任何东西,即使我在db中看到带有此值的记录.
所以我试着这样做:
select 'column1'
from 'some_table'
where 'some_float_field' <=> 2.18
Run Code Online (Sandbox Code Playgroud)
没有运气,所以然后我尝试转换为小数(浮动因某些原因不起作用),所以我尝试了这个:
select 'column1'
from 'some_table'
where 'some_float_field' <=> CAST('2.18' AS DECIMAL(20, 2))
Run Code Online (Sandbox Code Playgroud)
没有骰子...
请记住> =或<=返回正确的结果,只是<=>给我提出问题.
我如何在这里工作平等?
我有一段代码的行为不同,这取决于我是否通过字典获取转换因子或我是否直接使用它们.
将打印以下代码 1.0 == 1.0 -> False
但是,如果你更换factors[units_from]用10.0,并factors[units_to ]用1.0 / 2.54它将打印1.0 == 1.0 -> True
#!/usr/bin/env python
base = 'cm'
factors = {
'cm' : 1.0,
'mm' : 10.0,
'm' : 0.01,
'km' : 1.0e-5,
'in' : 1.0 / 2.54,
'ft' : 1.0 / 2.54 / 12.0,
'yd' : 1.0 / 2.54 / 12.0 / 3.0,
'mile' : 1.0 / 2.54 / 12.0 / 5280,
'lightyear' : 1.0 / 2.54 / …Run Code Online (Sandbox Code Playgroud) 我有大量的python代码试图处理4位小数精度的数字,并且由于很多原因我被困在python 2.4中.代码执行非常简单的数学(它是一个信用管理代码,主要采用或添加信用)
它混合了float和Decimal的使用(MySQLdb为SQL DECIMAL类型返回Decimal对象).在使用了几个奇怪的错误之后,我发现所有的根本原因是代码中的一些地方浮动和Decimals被比较.
我得到这样的案例:
>>> from decimal import Decimal
>>> max(Decimal('0.06'), 0.6)
Decimal("0.06")
Run Code Online (Sandbox Code Playgroud)
现在我担心的是我可能无法在代码中捕获所有这些情况.(一个普通的程序员会继续做x> 0而不是x> Decimal('0.0000')并且很难避免)
我想出了一个补丁(灵感来自python 2.7中对十进制包的改进).
import decimal
def _convert_other(other):
"""Convert other to Decimal.
Verifies that it's ok to use in an implicit construction.
"""
if isinstance(other, Decimal):
return other
if isinstance(other, (int, long)):
return Decimal(other)
# Our small patch begins
if isinstance(other, float):
return Decimal(str(other))
# Our small patch ends
return NotImplemented
decimal._convert_other = _convert_other
Run Code Online (Sandbox Code Playgroud)
我只是在一个非常早期的加载库中执行它,它将通过在比较之前允许float到Decimal转换来更改十进制包行为(以避免将python的默认对象命中对象).
我特意使用"str"而不是"repr",因为它修复了一些float的舍入情况.例如
>>> Decimal(str(0.6))
Decimal("0.6")
>>> Decimal(repr(0.6))
Decimal("0.59999999999999998")
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:我在这里遗漏了什么?这相当安全吗?还是我在这里打破一些东西?(我认为该软件包的作者有很强的理由避免浮动这么多)
我有两个div浮动:左.我z-index第一个div在上面,但它不起作用.这是因为浮动元素没有定位?
<html>
<style>
#wrap{
background:#666;
}
#menu, #thumbs{
float:left;
}
#menu{
background:#06C;
z-index:10;
}
#thumbs{
background:#0CF;
margin-left:-20px;
}
</style>
</head>
<body>
<div id="wrap">
<div id="menu">
<p>menu</p>
</div>
<div id="thumbs">
<p>thumbs</p>
</div>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud) 在Ruby中0.0 * -1 == -0.0.
我有一个应用程序,我将一堆Float对象乘以-1,但我不喜欢-0.0输出,因为它令人困惑.
是否有一种智能的Float#to_s输出方式0.0而不是-0.0?
Float通过某种擦除器/帮助器方法运行每个对象我完全没问题,但以下情况往往让我更加困惑:
def clean_output(amount)
if amount.zero?
0.0
else
amount
end
end
Run Code Online (Sandbox Code Playgroud)
更新:
为了更准确地说明我正在寻找什么,我想要一个解决方案,我可以在一大堆浮点运行,其中一些是负面的,一些是积极的.负面的应该保持负值,除非它们是负零,即-0.0.
例子:
clean_output(-0.0) #=> 0.0
clean_output(-3.0) #=> -3.0
clean_output(3.0) #=> 3.0
Run Code Online (Sandbox Code Playgroud) 我想知道如何在javascript中减去两个负浮点数.我试过了:
alert(-0.2-0.1);
Run Code Online (Sandbox Code Playgroud)
结果是-0.30000000000000004.难道我做错了什么?我该怎么做-0.3?
我找不到任何关于此的信息,但假设我有
var arr = [1, 2, 3];
var x = arr[1.5];
Run Code Online (Sandbox Code Playgroud)
我假设Javascript floor是索引并返回索引1处的项目,但它似乎至少在Chrome中返回undefined.
它是否正确?我找不到任何证实这一点的标准或文件.这实际上真的很不方便,因为我假设向下舍入行为允许你将范围[0,n)中的任何浮点数传递给数组索引,但是如果你做浮点数学运算,你似乎会默默地破坏你的数组不圆润.
编辑:如果有人正在维护javascript陷阱列表,请添加此一个.现在我要查看10k行的javascript代码,看看我做出的这个假设在哪里悄悄导致错误!
最近,我很好奇浮点数的哈希算法是如何工作的,所以我查看了源代码boost::hash_value.事实证明这很复杂.实际实现循环遍历基数中的每个数字并累积哈希值.与整数散列函数相比,它涉及更多.
我的问题是:为什么浮点哈希算法会更复杂?为什么不将浮点值的二进制表示形式哈希,就好像它是一个整数?
喜欢:
std::size_t hash_value(float f)
{
return hash_value(*(reinterpret_cast<int*>(&f)));
}
Run Code Online (Sandbox Code Playgroud)
我意识到float不能保证与int所有系统上的大小相同,但是可以使用一些模板元程序来处理这种事情,以推断出与其相同大小的整数类型float.那么引入一个专门针对浮点类型操作的完全不同的哈希函数有什么好处呢?