【问题标题】:Why does Micropython 'const' not accept float values?为什么 Micropython 'const' 不接受浮点值?
【发布时间】:2020-05-13 18:05:24
【问题描述】:

大多数 Micropython 端口都包含一个“micropython”模块,该模块具有一个名为“const()”的特定函数。我被引导相信它的行为很像 C 中的 '#define',但是,它只接受整数。有人知道为什么吗?你可以在 C 中声明浮点常量,那为什么在 micropython 中不可用呢?

我想有效地存储用于在单位之间转换的值,但其中许多是浮点值...(我考虑将它们乘以 10^x,然后在运行时除以它,但这很可能只需将浮点数存储在变量中并让代码使用查找表)。

知道为什么我们只能用micropython.const() 声明整数吗?

干杯:)

【问题讨论】:

  • “它的行为很像 C 中的 '#define'”#define 是一个预处理器命令,因此工作方式完全不同。
  • @KlausD.:MicroPython 的 const 被 MicroPython 编译器识别,因此它的行为更像 #define,而不是你在 CPython 中可以做的任何事情。您不能做任何复杂的宏操作,但const 值将直接替换到它们的使用位置(至少在一个模块内),并且非导出的consts 不需要存储位置。跨度>
  • 啊,好的,谢谢@user2357112supportsMonica 和 KlausD,我了解预处理器命令并看到使用上的细微差别。缺乏浮点支持是否可能与整数和浮点数的不同空间要求有关?
  • MicroPython 只接受const 的所谓“小整数”; “大”整数(即不适合机器字的整数减去一些位)和浮点值需要在堆上分配。 const 替换等在我认为解析时完成,然后再编译。至于您的实际问题,即为什么这不适用于堆分配的对象:我想从技术上讲这是可能的,但它可能太难了,不确定..

标签: python constants micropython


【解决方案1】:

这是设计使然,micropython.const() 的目的是在 MCU 上节省 RAM 因此根据文档:
const() 的参数可能是在编译时计算为整数的任何东西。 http://docs.micropython.org/en/latest/reference/constrained.html?highlight=const()#execution-phase

【讨论】:

  • 这将如何节省 RAM?我认为与 CPython 不同的是,Micropython 浮点数是 32 位的(与 CPython 的 64 位等效于双精度值不同),所以它们占用与整数相同的空间?
  • @birdistheword99,详细信息在链接参考文档的第 1 段中进行了说明。 the compiler will avoid coding a lookup to the name of the constant by substituting its literal value. This saves bytecode and hence RAM.
  • MicroPython 整数是有符号的 31 位 smallint(保留 1 位来标记指针,但我找不到对它的文档引用)
  • 感谢您提供的信息,我很抱歉在这里很愚蠢,但回到最初的问题,如果编译器通过用查找整数代替实际整数来节省 RAM,为什么不能它对浮点数做同样的事情吗?为什么FOO = const(1.234) 不能告诉编译器用1.234 替换FOO 并以同样的方式保存字节码?
猜你喜欢
  • 2020-09-18
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 2014-07-21
  • 1970-01-01
相关资源
最近更新 更多