ZML_双浮点
Two float values in one node — the pack's twist on a primitive
- A
- B
A node that outputs two floats, A and B, each set with its own slider. No math, no side effects - it's the "one source, many consumers" pattern from ComfyUI's plumbing layer, but with two knobs in one box instead of one. If you've got two related numeric values you keep tuning together - denoise and CFG, or two animation interpolation weights - this saves you from hunting around the canvas for two separate value nodes.
How it works
Read the source and it's embarrassingly direct: get_floats returns (A, B). The only real machinery is the widget config: both A and B run 0–16384 in steps of 0.1, defaults at 10.0. Beyond that it's a plain FLOAT source node - wire either output to any FLOAT socket (denoise, CFG, strength, blend factors) and the value fans out from one authoritative place. Change it once, every consumer updates.
The inputs
- A - FLOAT, 0–16384, step 0.1, default 10.
- B - FLOAT, same range.
Two outputs, also named A and B, matching. That's the whole interface.
Installing
Standard ZML pack:
cd ComfyUI/custom_nodes
git clone https://github.com/zml-w/ComfyUI-ZML-Image
restart, or ComfyUI Manager (search "ComfyUI-ZML-Image"). Nothing extra to download. The translation patch at https://github.com/zml-w/ZZZ_ZML_English_Patch swaps the Chinese labels to English.
The honest take
This is a value node, and it's worth being clear about where it fits. Core ComfyUI's PrimitiveFloat does the single-value job, and "convert widget to input" means you can often drag a value off any node directly - so a two-value node is a convenience, not a capability. Where the ZML version earns its keep is within the pack itself: the ZML sampler's widgets and several other ZML nodes expect wired-in floats, and this gives you the two you most commonly need - denoise, CFG - in one place with sensible bounds.
Two practical notes. First, the 0–16384 range with a 0.1 step is generous but coarse: you can't type 4.25 if you want it - well, you can, it's just not the intended granularity; type into the field rather than dragging if you need precision. Second, because the outputs are untyped until connected in some frontends' eyes, wire them into a FLOAT socket before you trust the connection. And that's it - set A, set B, move on with your life.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| A | FLOAT | 10.00–16384 | — |
| B | FLOAT | 10.00–16384 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| A | FLOAT | — |
| B | FLOAT | — |