有没有办法以编程方式获得最接近1.0的double,但实际上不是1.0?
一种hacky方法是将double转换为相同大小的整数,然后减去一个.IEEE754浮点格式的工作方式,最终将指数减少一,同时将小数部分从全零(1.000000000000)更改为全1(1.111111111111).但是存在一些机器,其中整数存储为little-endian而浮点存储为big-endian,因此并不总是有效.
背景:我在一个大代码环境中,运行全局构造函数的未定义顺序是有问题的.所以我有一个自定义类,旨在延迟初始化直到首次使用.它的所有魔力都发生在它的运算符*和operator->函数中; 他们是唯一定义的东西.它还在其自身内存储一些状态,以使自动初始化功能可用.当然,该状态必须是POD,所以整个类都是POD,所以它可以在任何人的代码开始运行之前完全设置,这样所有代码都可以在任何地方使用所有全局变量,而不必担心全局变形尚未成立.
有一段时间后,有人添加了一个私有的,从未定义过的赋值运算符,因此永远不会将该类型赋值给它(它的设计无论如何都不会改变).现在有人说这堂课已经坏了,因为它不是POD.如果不是声明但未定义,我将其声明为"=删除",我认为这更好.实际上,通过该更改,std :: is_pod <> :: value将返回类型的true.
但是,作为赋值运算符会阻止某个类型成为POD吗?我认为要求只是它必须只有公共数据成员,没有虚拟方法,没有构造函数或析构函数.
更重要的是我的情况:是否存在一个永不定义的赋值运算符会阻止该类在全局初始化时与所有其他全局POD一起初始化?
减少的例子:
struct LazyString {
const char *c_str;
bool has_been_inited;
string *lazy_str_do_not_use_directly;
string &operator*() { return *get(); }
string *operator->() { return get(); }
private:
string *get() {
// The real code uses a mutex, of course, to be thread-safe.
if (!has_been_inited) {
lazy_str_do_not_use_directly = new string(c_str);
has_been_inited = true;
}
return lazy_str_do_not_use_directly;
}
// Does this make the class non-POD?
// If so, does that mean that global variables of …
Run Code Online (Sandbox Code Playgroud) 我习惯使用C/Java,我可以使用?:如:
func g(arg bool) int {
return mybool ? 3 : 45;
}
Run Code Online (Sandbox Code Playgroud)
由于Go没有三元运算符,我该怎么做呢?
我正在编写一个例程来确定32位整数的高16位是否设置了更多位或低位.
在C中,我会写这个:
bool more_high_bits(int a) {
if ((a >> 16) == 0) return false; // no high bits
if ((a & 0xFFFF) == 0) return true; // no low bits
// clear one high bit and one low bit, and ask again
return more_high_bits(a&(a - 0x10001));
}
Run Code Online (Sandbox Code Playgroud)
所以在Haskell中,我正在尝试这个:
more_high_bits a=if (a `shiftR` 16) /= 0 then 0 else
if ((.&.) a 65535) /= 0 then 1 else
more_high_bits((.&.) a (a-65537))
Run Code Online (Sandbox Code Playgroud)
但它只是超时.
我究竟做错了什么?这样做的惯用方法是什么?请不要编码转移或者&因为我想知道我应该如何使用这些.
附录:我在haskell编译器上尝试了这个代码:
http://www.tutorialspoint.com/compile_haskell_online.php
import Data.Bits
g a=if (a `shiftR` …
Run Code Online (Sandbox Code Playgroud)