This is actually a weird syntax issue with [expr]. In most objects in Pd, every number is treated as a float. However, [expr] is based off of C expressions. In C, when an expression is compiled, if it looks like an integer it's treated like an integer. 1 and 2 are integers, and therefore the expression 1/2 will be compiled as an integer i.e., 1/2 = .5, int(.5) = 0. So your expression becomes pow($f1, 0). (By the way, this always gives me 1, as it should, not 0).
To fix this, just add a decimal point to one of those numbers. For example:
[expr pow($f1, 1/2.)]
Seeing the decimal point after the 2 tells [expr] that it should be treated as a float. This will give you the right answer. As a side note, this is also how Max does it with all objects using numbers, which makes it even weirder to see in Pd.